我正在开发一个项目,其中我有一个主线程和一个守护程序线程来执行文件输出。在我的主线程中,我有一个字段pthread_t * _daemon
,我想删除它,但显然只有在_daemon
返回NULL之后(我明白使用pthread_exit()
会导致内存泄漏)。
如果没有忙碌等待,我怎么能这样做?如果我尝试使用条件变量我有一个问题 - 当我调用signal()
形式_daemon
来唤醒我的主线程时,它会在_daemon
返回NULL之前删除_daemon
我所做的只是使用在_daemon
返回之前启动和解锁程序时锁定的互斥锁。有没有更好的方法不会导致繁忙的等待?
答案 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_t
是unsigned long int
,所以我真的不需要制作pthread_t
的指针(您也可以在pthread
函数中使用它的地址),但是如果你坚持,那么你可以在创建pthread
后删除它(但是你将无法与它通信,因为它是一些创建的线程 - 用于加入,分离函数等)