我想为给定的线程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类型是可比较和可分配的,假设基于
我之所以这么做,是因为我认为对无效的线程id调用pthread_join是一种未定义的行为。事实并非如此。然而,加入之前加入的线程是未定义的行为。现在让我们假设上面的“函数”被重复调用。无条件地调用pthread_join并检查结果可能会导致在先前加入的线程上调用pthread_join。
发布于 2011-06-08 18:08:40
你的假设一开始就是错误的。pthread_t对象是不透明的。您不能在C中直接比较pthread_t类型,而应该使用pthread_equal。
另一个注意事项是,如果pthread_create失败,您的pthread_t的内容将是未定义的。它可能不会再设置为您的无效值。
我更喜欢保留pthread_create调用的返回值(以及线程is ),并使用该返回值来确定每个线程是否正确启动。
发布于 2011-06-08 18:04:47
根据托尼的建议,您可以在这种情况下使用pthread_self()。
但不能使用==或!=来比较thread_t。使用pthread_equal。
从pthread_self手册页:
因此,pthread_t类型的变量不能使用C相等运算符(==)进行可移植的比较;请改用pthread_equal(3)。
发布于 2014-02-04 04:27:36
我最近遇到了同样的问题。如果pthread_create()失败,我将在phtread_t结构中存储一个未定义的无效值。因此,我保留了一个与每个线程关联的布尔值,如果pthread_create()成功,该布尔值将设置为true。
那我要做的就是:
void* status;
if (my_thread_running) {
pthread_join(thread, &status);
my_thread_running = false;
}https://stackoverflow.com/questions/6276939
复制相似问题