【发布时间】:2021-03-04 12:42:27
【问题描述】:
pthread_kill() 的 Linux 手册有以下段落:
POSIX.1-2008 建议,如果实现检测到使用 生命周期结束后的线程 ID,pthread_kill() 应该返回错误 ESRCH。 glibc 实现返回 在可以检测到无效线程 ID 的情况下出现此错误。 但还要注意,POSIX 表示尝试使用线程 ID 生命周期已结束会产生未定义的行为,并尝试 例如,在调用 pthread_kill() 时使用无效的线程 ID 可以: 导致分段错误。
问题是,在检查线程 ID 是否有效和发出 pthread_kill() 之间,线程可能已经终止。使用pthread_kill() 本质上是不安全的,因为总是存在可能变成未定义行为的竞争条件?
如何确保线程 ID 有效?
【问题讨论】:
-
确切地说,线程必须被终止并且加入或分离,因为它现在无效的线程 ID 来呈现这场比赛。在严格的 POSIXy 语言中,terminated thread is still within its lifetime 只是“非活动”(不再运行但尚未分离/加入)。也就是说,好问题。
-
between checking the thread ID is valid and issuing the pthread_kill(), the thread might have terminated你是说,里面pthread_kill打电话?这很简单 -pthread_kill具有内部全局锁,所以它不会发生,不是吗? -
@KamilCuk 不在
pthread_kill内部,而是在我决定调用pthread_kill的if和调用本身之间。 -
你为什么要检查它?只需拨打
pthread_kill? -
通常在我有理由相信是有效的线程 ID 上触发
pthread_kill。但是在触发和调用之间,一个分离的线程可能已经结束。