如何确定分离的 pthread 是否还处于活动状态?
- 2024-11-14 08:29:00
- admin 原创
- 16
问题描述:
如何确定分离的 pthread 是否仍然有效?
我有一个与线程的通信通道(一个从线程向外指向的单向队列)但是如果线程突然死亡会发生什么?
我是否应该放弃使用进程信号或者是否可以以某种方式探测线程活跃性?
解决方案 1:
对于可连接(即非分离)的 pthread,你可以像这样使用pthread_kill :
int ret = pthread_kill(YOUR_PTHREAD_ID, 0);
如果您得到ESRCH值,则可能表示您的线程已死亡。
然而这并不适用于分离的 pthreads,因为在它结束后,它的线程 ID 可以被另一个线程重新使用。
来自评论:
答案是错误的,因为如果线程已分离且未处于活动状态,则 pthread_t 无效。您无法将其传递给 pthread_kill。例如,它可能是指向已释放的结构的指针,从而导致程序崩溃。POSIX 规定:“符合要求的实现可以在线程 ID 的生命周期结束后自由重用该线程 ID。如果应用程序尝试使用生命周期已结束的线程 ID,则行为未定义。” – 感谢@DavidSchwartz
解决方案 2:
这个问题假设设计中存在不可避免的竞争条件。
据推测,你打算做这样的事情:
检查线程是否还活着
等待线程消息
问题是这个序列不是原子的,无法修复。具体来说,如果你正在检查的线程在步骤 (1) 和步骤 (2) 之间死亡了怎么办?
竞争条件很可怕,罕见竞争条件更是雪上加霜。用 99.999% 可靠的事物掩盖 90% 可靠的事物是你可能做出的最糟糕的决定之一。
对你的问题的正确回答是“不要这样做”。相反,应该修复你的应用程序,使线程不会随机死亡。
如果这是不可能的,而且有些线程容易崩溃,而您需要从中恢复……那么您的设计从根本上就是有缺陷的,您不应该使用线程。将那个不可靠的东西放在不同的进程中,并使用管道与其通信。进程死亡会关闭文件描述符,而读取另一端已关闭的管道具有明确定义、易于检测、无竞争的行为。
解决方案 3:
当您向已死线程发送信号时,这可能是未定义的行为。您的应用程序可能会崩溃。请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=4509和http://udrepper.livejournal.com/16844.html
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件