在我的析构函数中,我想干净地销毁线程。
我的目标是等待线程完成执行,然后销毁该线程。
我发现查询 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 清理处理程序
您需要包含相应的 pthread_cleanup_pop(1) 调用,以确保无论如何都会调用清理处理程序(即,如果线程正常退出或由于取消等)。
然后,线程 A 可以简单地检查“thread_complete”标志来查看线程 B 是否已退出。
注意:您的“thread_complete”标志应声明为“易失性”,并且应该是原子类型——GNU 编译器为此目的提供了 sig_atomic_t。这允许两个线程一致地访问相同的数据,而不需要同步结构(互斥体/信号量)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)