仅在守护程序线程返回后删除它
Deleting a daemon thread only after it returns
我正在做一个项目,其中我有一个主线程和一个守护进程线程来执行文件输出。在我的主线程中,我有一个我想删除的字段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
后删除它(但这样你就没有办法与它通信了, 因为它是许多创建的线程 - 用于连接、分离函数等(。
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- C++链表删除和删除返回功能
- 从函数返回数组时是否需要删除
- 如何删除新分配的字符,这也是函数返回值?
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- C++函数何时删除返回值?
- 为什么std ::删除文件始终返回-1
- 使用模板返回值从函数中删除类型
- 更改C 的返回指针后可以删除工作
- 删除为应该在哈希表中的记录返回 false 的函数
- unique_ptr具有右值删除器的构造函数返回 null
- 删除从函数返回的指针
- 返回指针的函数是否要求我删除返回的值?
- 删除返回字符*的位置
- 删除返回值后的指针
- 删除返回内存问题
- 如何指示需要删除返回值
- 复制-删除返回的自动变量