首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否存在无效的pthread_t id?

是否存在无效的pthread_t id?
EN

Stack Overflow用户
提问于 2011-06-08 17:49:42
回答 7查看 27K关注 0票数 55

我想为给定的线程id调用pthread_join,但前提是该线程已经启动。安全的解决方案可能是添加一个变量来跟踪哪个线程在哪里启动或未启动。但是,我想知道是否可以检查pthread_t变量,如以下代码所示。

代码语言:javascript
复制
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。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-08 18:08:40

你的假设一开始就是错误的。pthread_t对象是不透明的。您不能在C中直接比较pthread_t类型,而应该使用pthread_equal。

另一个注意事项是,如果pthread_create失败,您的pthread_t的内容将是未定义的。它可能不会再设置为您的无效值。

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

票数 18
EN

Stack Overflow用户

发布于 2011-06-08 18:04:47

根据托尼的建议,您可以在这种情况下使用pthread_self()

但不能使用==!=来比较thread_t。使用pthread_equal

pthread_self手册页:

因此,pthread_t类型的变量不能使用C相等运算符(==)进行可移植的比较;请改用pthread_equal(3)。

票数 14
EN

Stack Overflow用户

发布于 2014-02-04 04:27:36

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

那我要做的就是:

代码语言:javascript
复制
void* status;
if (my_thread_running) {
  pthread_join(thread, &status);
  my_thread_running = false;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6276939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档