在我的析构函数中,我想彻底销毁一个线程。
我的目标是等待一个线程完成执行,然后销毁该线程。
关于查询 pthread 的状态,我唯一发现的是 pthread_attr_setdetachstate但这只会告诉您线程是否:
- PTHREAD_CREATE_DETACHED
- PTHREAD_CREATE_JOINABLE
这两个都与线程是否还在运行无关。
如何查询 pthread 以查看它是否仍在运行?
最佳答案
听起来你在这里有两个问题:
我如何才能等到我的线程完成?
回答:这是直接由 pthreads 支持的——让你的待停止线程 JOINABLE(当它第一次启动时),并使用 pthread_join() 阻塞你的当前线程,直到待停止线程不再运行。
如何判断我的线程是否仍在运行?
答案:您可以添加一个“thread_complete”标志来完成此操作:
场景:线程 A 想知道线程 B 是否还活着。
当线程 B 创建时,它被赋予一个指向“thread_complete”标志地址的指针。在创建线程之前,“thread_complete”标志应初始化为 NOT_COMPLETED。线程 B 的入口点函数应立即调用 pthread_cleanup_push() 以推送将“thread_complete”标志设置为已完成的“清理处理程序”。
在此处查看有关清理处理程序的详细信息:pthread cleanup handlers
您需要包含相应的 pthread_cleanup_pop(1) 调用以确保无论发生什么情况(即线程正常退出或由于取消等)都会调用清理处理程序。
然后,线程 A 可以简单地检查“thread_complete”标志以查看线程 B 是否已经退出。
注意:您的“thread_complete”标志应声明为“volatile”并且应该是原子类型——GNU 编译器为此提供了 sig_atomic_t。这允许两个线程一致地访问相同的数据,而不需要同步结构(互斥量/信号量)。
关于c - 您如何查询 pthread 以查看它是否仍在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156353/