【问题标题】:Calling pthread_join on a pthread_t which may not have been created在可能尚未创建的 pthread_t 上调用 pthread_join
【发布时间】:2016-01-12 13:09:06
【问题描述】:

我们有一个类有一个受保护的 pthread_t 变量。一旦构建了该类,pthread_t 就存在了,但它没有分配给它的 ID,这正是 pthread_create 所做的。

在这种情况下可以在 pthread_t 变量上调用 pthread_join 吗?

如果我正确理解 pthread_join 的手册页,它应该会返回 ESRCH 错误,但此手册页的解释可能不同。

【问题讨论】:

  • 你怎么知道你的pthread_t变量不包含已经创建的线程的ID,从而导致调用者等待错误的线程?
  • 好点。不知何故,我假设将创建 pthread_t 并将 ID 初始化为 0 / 不可能的 ID。是否可以查看pthread_t并检查ID是否已设置?
  • 是否可以查看 pthread_t 并检查 ID 是否已设置? 您可以使用调试器或发出带有 ID 值的某种类型的日志消息.如何初始化值?
  • 我不知道它是如何初始化的。 Pthread_create 根据手册页设置该 ID。我只是想避免携带“已初始化”标志。如果我可以在尚未与 pthread_create 一起使用的 pthread_t 上调用 pthread_join,那就太好了。如果我能以某种方式查看 pthread_t 对象并检查自己是否已“创建”它,那也很好。
  • 您的 pthread_t 值必须以某个值开头 - 它要么是不确定的,要么已初始化为特定值。

标签: pthreads posix pthread-join


【解决方案1】:

pthread_t 只不过是 unsigned long int,因此在声明期间将其初始化为 0 值。现在就在 pthread_join 之前检查它是否非零。如果它是零,则不调用 pthread_create。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    相关资源
    最近更新 更多