我想为给定的线程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。
您的假设一开始是不正确的。pthread_t对象是不透明的。您不能直接在C中比较pthread_t类型。您应该改用pthread_equal。
另一个考虑因素是,如果pthread_create失败,则pthread_t的内容将是未定义的。可能不再将其设置为无效值。
我的喜好是保留pthread_create调用的返回值(以及线程ID),并使用该值来确定每个线程是否已正确启动。