当前位置: 首页 > 面试题库 >

是否存在无效的pthread_t ID?

鱼志诚
2023-03-14
问题内容

我想为给定的线程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),并使用该值来确定每个线程是否已正确启动。



 类似资料:
  • 添加日志语句后,getViewType似乎只接收到0的位置。这导致onCreateView只加载一个布局: 加载CommentFragment的片段转换: 片段的OnCreateView: 适配器代码(感谢hister让我开始): 使用上面的代码,只显示头布局,因为viewType始终为0。看起来是这样的。如果我强制另一个布局,它看起来如下所示:

  • 问题内容: 我有一个脚本,可以用来构造表和存储过程。例如,我有一个类型为的列。需要一个size参数,该大小我也用作存储过程以及这些过程中的参数。 是否有可能具有a的等价形式,因此我可以轻松调整大小而无需在整个脚本中进行更改? 我正在使用MySql工作台。 编辑 我曾尝试和 我有一个脚本-这是(删节的) 我想要实现的是用一个 常量 替换脚本中的值25-类似于创建表和存储过程的脚本顶部的a ,因此我能

  • 问题内容: 我有两个对象,想要将它们配对,就像Python中的函数一样。我很确定JDK中没有此功能,但是在相当广泛的库中是否有类似Apache通用收藏集的类似内容?谢谢。 问题答案: 功能Java具有,以及您对Haskell或Scala的期望。(实际上,作者几乎都是Haskell程序员。)

  • 问题内容: 我有两个对象,想要将它们配对,就像中的函数一样。我很确定JDK中没有此功能,但是在相当广泛的库中是否有类似通用收藏集的类似内容?谢谢。 问题答案: 功能Java具有zip,zipWith以及zipIndex您对或的期望。(实际上,作者几乎都是Haskell程序员。)

  • has 确定数据是否存在has($table, $where) table [string] 表名. where [array] WHERE 条件.has($table, $join, $where) table [string] 表名. join [array] 多表查询. where [array] WHERE条件.Return: [boolean] 返回 TRUE 或者 FALSE.可用于做

  • has 确定数据是否存在has($table, $where) table [string] 表名. where [array] WHERE 条件.has($table, $join, $where) table [string] 表名. join [array] 多表查询. where [array] WHERE条件.Return: [boolean] 返回 TRUE 或者 FALSE.可用于做