仅在返回后删除守护程序线程

时间:2012-05-13 09:03:13

标签: c++ locking pthreads

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

如果没有忙碌等待,我怎么能这样做?如果我尝试使用条件变量我有一个问题 - 当我调用signal()形式_daemon来唤醒我的主线程时,它会在_daemon返回NULL之前删除_daemon

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

2 个答案:

答案 0 :(得分: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))。

答案 1 :(得分:1)

pthread_tunsigned long int,所以我真的不需要制作pthread_t的指针(您也可以在pthread函数中使用它的地址),但是如果你坚持,那么你可以在创建pthread后删除它(但是你将无法与它通信,因为它是一些创建的线程 - 用于加入,分离函数等)