有没有一个无效的pthread_t编号?

我想调用pthread_join给定的线程ID,但只有当该线程已经启动。 安全的解决scheme可能是添加一个variables来跟踪哪个线程开始或不开始。 不过,我不知道检查pthread_tvariables是可能的,像下面的代码。

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”macros

PS:我的假设是,pthread_ttypes是可比的,可分配的,假设基于

PPS:我想这样做,因为我认为调用无效的线程ID pthread_join是undefinde行为。 不是这样。 但是,join之前join的线程是未定义的行为。 现在让我们假设重复调用上面的“function”。 无条件地调用pthread_join并检查结果可能会导致在以前连接的线程上调用pthread_join。

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

另一个考虑是如果pthread_create失败,你的pthread_t的内容将是未定义的。 它可能不会被设置为您的无效值。

我的首选是保持pthread_create调用的返回值(以及线程ID),并使用它来确定每个线程是否正确启动。

正如Tony所build议的,在这种情况下可以使用pthread_self()

不要使用==!=来比较thread_t 。 使用pthread_equal

pthread_self手册页:

因此,typespthread_t的variables不能使用C相等运算符(==)进行可移植的比较; 改用pthread_equal(3)。

不幸的是,在pthread_t是一个指针的系统上,即使两个参数指向不同的线程, pthread_equal()也可以返回相等的结果,例如一个线程可以退出并且可以使用相同的pthread_t指针值创build一个新的线程。

我最近遇到了同样的问题。 如果pthread_create()失败,我最终会在我的phtread_t结构中存储一个未定义的无效值。 因此,如果pthread_create()成功,我将保持与每个线程关联的布尔值。

那么我需要做的是:

 void* status; if (my_thread_running) { pthread_join(thread, &status); my_thread_running = false; }