【发布时间】:2011-03-27 11:21:16
【问题描述】:
我有一个线程函数,它使用 malloc() 分配内存。我使用 pthread_kill 杀死了线程,但没有释放动态分配的内存。调用 pthread_kill 后会自动释放它还是会出现泄漏?
【问题讨论】:
标签: c memory-management memory-leaks pthreads
我有一个线程函数,它使用 malloc() 分配内存。我使用 pthread_kill 杀死了线程,但没有释放动态分配的内存。调用 pthread_kill 后会自动释放它还是会出现泄漏?
【问题讨论】:
标签: c memory-management memory-leaks pthreads
您在一个线程中分配的内存不“属于”该线程。它是从所有其他线程正在使用您的程序的同一个全局堆中分配的。所以你必须释放你分配的所有内存,否则你最终会出现泄漏。
【讨论】:
正如vicatcu所说,会有泄漏。
我永远不会推荐使用pthread_kill,除非你绝对必须这样做。相反,您应该创建一个信号机制,让线程知道何时应该完成,然后加入线程。并且线程函数应该偶尔轮询那个值,如果它得到一个终止信号,它应该清理自己的资源并退出。
当然,另一种选择是尽量不在线程中分配内存。但我想你并不总是得到那种奢侈。 :-)
【讨论】:
会有泄漏。 pthreads kill 函数如何知道通过 malloc 分配的变量的名称? C中没有垃圾回收,如果你在某个地方调用malloc,你最好确保你在其他地方调用free。
[编辑] 也许您应该只设置一个与您的线程关联的全局标志变量,并让您的线程偶尔轮询该变量以了解它是否以及何时应该自行终止。
【讨论】:
是,假设您没有为您使用的信号安装信号处理程序,并且该信号的默认操作是进程终止。
那是因为pthread_kill 不会杀死线程,它会向线程发送信号。如果该信号的作用是终止进程,那么整个进程将不复存在,随之而来的是进程中任何线程分配的任何动态内存。
没有办法杀死线程。
【讨论】: