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

Deleting a daemon thread only after it returns

本文关键字:删除 返回 线程 守护程序      更新时间:2023-10-16

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

我怎样才能做到不忙于等待?如果我尝试使用条件变量,我遇到了问题 - 当我调用表单_daemon signal()唤醒我的主线程时,它会在它之前删除_daemon _daemon返回 NULL。

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

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()手册页说:

当一个 分离的线程终止,其资源自动释放回 系统。[截图]分离线程对于某些类型的守护程序很有用 应用程序不需要关注其退出状态的线程。 由 默认情况下,将在可加入状态下创建新线程,除非 ATTR 设置为 创建处于分离状态的线程(使用 pthread_attr_setdetachstate(3((。

pthread_t是一个

unsigned long int,所以我真的认为没有必要制作一个pthread_t指针(你也可以在pthread函数中使用它的地址(,但如果你坚持,那么你可以在创建一个pthread后删除它(但这样你就没有办法与它通信了, 因为它是许多创建的线程 - 用于连接、分离函数等(。