5

我正在开发一个项目,其中我有一个主线程和一个守护线程来执行文件输出。在我的主线程中,我有一个pthread_t * _daemon要删除的字段,但显然只有在_daemon返回 NULL 之后(我知道使用pthread_exit()会导致内存泄漏)。

我怎么能在没有忙等待的情况下做到这一点?如果我尝试使用条件变量,我会遇到问题 - 当我调用signal()表单_daemon来唤醒我的主线程时,它会在返回 NULL_daemon之前删除。_daemon

我所做的只是使用一个互斥锁,该互斥锁在程序启动时锁定并在_daemon返回之前解锁。有没有更好的方法不会导致忙等待?

4

2 回答 2

5

pthread_detach()做你正在寻找的东西。听起来它会以更少的复杂性解决您的问题(不泄漏)!

因此,当您在另一个线程中完成它时,您可以安全地调用pthread_detatch(_daemon)它,而不必担心线程本身是否仍在运行。它不会终止线程,而是会在线程终止时清理线程。

从文档中:

pthread_detach()函数应向实现指示线程线程的存储可以在该线程终止时回收。如果线程尚未终止,pthread_detach()则不应使其终止。

您实际上可以通过以下设置创建一个处于分离状态的线程attr

   int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

在创建时适当地。pthread_create()手册页说:

当一个分离的线程终止时,它的资源会自动释放回系统。[ snip ] 使线程分离对于应用程序不需要关心其退出状态的某些类型的守护线程很有用。默认情况下,新线程在可连接状态下创建,除非 attr 设置为在分离状态下创建线程(使用 pthread_attr_setdetachstate(3))。

于 2012-05-13T09:17:11.033 回答
1

pthread_t是 a unsigned long int,所以我真的不认为需要创建一个指针pthread_t(你也可以在函数中使用它的地址pthread),但是如果你坚持,那么你可以在创建 a 后删除它pthread(但是你将没有办法与它通信,因为它是许多创建的线程 - 用于加入、分离功能等)。

于 2012-10-29T15:42:59.140 回答