2013-06-05 48 views
4

在我的计划,我处理新主题与是否需要分离pthread以防止内存泄漏?

pthread_t thread; 
pthread_create(&thread, NULL, 
      c->someFunction, (void *) fd); //where fd is ID of the thread 

的问题是很简单 - 如果我只是让someFunction完成,是它需要再C++到例如某事物join或其他任何东西,prevenet memory leaks或内存是否自动释放??

回答

7

opengroup page for pthread_join

的在pthread_join()函数提供了一种简单的机制,允许一个应用 等待一个线程终止。在线程 终止之后,应用程序可以选择清理线程使用的资源 。例如,在pthread_join()返回后, 可以回收任何应用程序提供的堆栈存储。

的在pthread_join()或pthread_detach()函数最终应要求与该detachstate属性被 集创建到PTHREAD_CREATE_JOINABLE所以与 线程相关联的存储可以被回收的每个线程 。

并从man page of pthread_join

未加入具有螺纹即可连接(即,一个不 分离的),亲 duces“僵尸线程”。避免这样做,因为每个僵尸线程都会消耗一些系统资源,并且当有足够的僵尸线程累积时,将不再有可能创建新线程(或进程)的可能性为 。

waitpid没有pthreads类似物(-1,& status,0),即“加入任何ter- minated线程”。

如果您认为您需要此功能,您可能需要重新考虑您的应用程序设计。

如果你这样做pthread_detach

的pthread_detach()函数应该指示执行 是存储该线程的线程可以被回收时,该线程 终止

如果您不要detachjoin a joinable线程,它会导致资源浪费

+0

删除我的答案,你的更好。 – BoBTFish

+0

因此,当我想退出应用程序时,是否需要遍历创建线程和'deatch'的'vector'(最终在完成其工作后“分离”某个线程)?我问,因为我不确定是否理解'join'和'detach'之间的区别。但在我看来,我可以肯定,在我打电话之后,“detach”会终止线程,对吧? – Dworza

+4

如果您将线程分离,线程完成工作时线程的资源将被释放。Join用于连接到一个线程(如果你在main中的某个线程上进行连接,main将不会执行直到线程被终止并且其资源被释放)。 'join'和'detach'用于不同的目的。但它们都释放资源.Detach不是用于终止线程,线程将自行终止.Detached意味着没有人正在等待线程终止。 (就像在加入,有人正在等待线程终止,因此它可以加入 –

相关问题