一尘不染

是否存在无效的pthread_t ID?

linux

我想为给定的线程ID调用pthread_join,但前提是该线程已经启动。安全的解决方案可能是添加一个变量以跟踪哪个线程在何处启动。但是,我想知道是否可以检查pthread_t变量,类似于以下代码。

pthread_t thr1 = some_invalid_value; //0 ?
pthread_t thr2 = some_invalid_value;

/* thread 1 and 2 are strated or not depending on various condition */
....

/* cleanup */
if(thr1 != some_invalid_value)
    pthread_join(&thr1);

if(thr2 != some_invalid_value)
    pthread_join(&thr2);

其中some_invalid_value可以为0,或取决于实现的“ PTHREAD_INVALID_ID”宏

PS:我的假设是pthread_t类型是可比较且可分配的,假设基于

PPS:我想这样做,因为我认为在无效的线程ID上调用pthread_join是不确定的行为。它不是。但是,加入先前加入的线程是未定义的行为。现在,假设上述“函数”被重复调用。无条件调用pthread_join并检查结果可能会导致在先前加入的线程上调用pthread_join。


阅读 542

收藏
2020-06-03

共1个答案

一尘不染

您的假设一开始是不正确的。pthread_t对象是不透明的。您不能直接在C中比较pthread_t类型。您应该改用pthread_equal。

另一个考虑因素是,如果pthread_create失败,则pthread_t的内容将是未定义的。可能不再将其设置为无效值。

我的喜好是保留pthread_create调用的返回值(以及线程ID),并使用该值来确定每个线程是否已正确启动。

2020-06-03