【问题标题】:A Unique and Constant Identifier for a pthreads thread?pthreads线程的唯一和常量标识符?
【发布时间】:2009-06-27 09:24:16
【问题描述】:

我假设 pthread_t 在它的整个生命周期内都保持不变 - 对于给定的线程 - 但我的实验似乎证明了这个假设是错误的。如果给定线程的 id 在其生命周期中不保持不变,我如何存储 pthread_t 以便另一个线程可以使用 pthread_join 阻塞直到线程完成?

由于其他原因,知道如何获取线程的唯一标识符,我可以将它来回转换为pthread_t,这对我很有用。有没有办法做到这一点?

那里有很多很棒的信息,但我很难为这些问题找到有用的答案。 如果能得到任何帮助/建议,我将不胜感激!

编辑:另外,我不知道为什么,但是在每个新线程的前面(在线程的函数内)添加 sleep(1) 和休眠 1 秒时,一切似乎都按预期工作。这可能是一根稻草,但pthread_t 的值是否会在新线程开始时瞬间改变??

【问题讨论】:

  • 你能发布你的“实验”来证明这个假设是错误的吗?我敢打赌,问题出在实验中。您的编辑说添加“睡眠()”会改变结果似乎指向那个方向。

标签: c++ multithreading pthreads


【解决方案1】:

您不能依赖 pthread_t 是唯一的,但您可以使用 pthread_equal() 来确定两个线程 ID 是否引用同一个线程。

NAME
     pthread_equal -- compare thread IDs

SYNOPSIS
     #include <pthread.h>

     int
     pthread_equal(pthread_t t1, pthread_t t2);

DESCRIPTION
     The pthread_equal() function compares the thread IDs t1 and t2.

RETURN VALUES
     The pthread_equal() function will return non-zero if the thread IDs t1 and t2
     correspond to the same thread. Otherwise, it will return zero.

【讨论】:

  • 谢谢!我认为这基本上是我的问题。不过,还有一个后续问题:我获得并保存的旧 pthread_t 是否仍可用于引用特定线程?
  • 嘿,quintus,您为什么不接受这个答案,并为您下次尝试违反 posix 标准提出一个新问题?
  • @fistman:违反 posix 标准是什么意思?在处理线程时想要一个唯一的标识号是违反规则的? @Beano:您的解决方案很有帮助,但我的问题没有解决。 pthread_equal 没有改变任何东西。我认为使用 pthread_equal 是因为 pthread_t 有时是一个结构,而不是因为多个数字与同一个线程相关!有什么想法吗?...
  • I pthread_t 来自函数 pthread_create() 和 pthread_self() 可用于在线程的生命周期内引用特定线程。 pthread_t 应该被视为一个不透明的值,只能与 pthread_equal() 进行比较。
  • 我能够通过映射容器将我自己的唯一键关联到 pthread_t 对象并在需要时使用 pthread_equal() 找到正确的 pthread_t 来解决这个问题。谢谢大家!
【解决方案2】:

pthreads 线程的唯一且常量标识符?

为确保您启动的每个线程都能被唯一标识:

  • 使用单调递增的计数器
  • 将计数器分配给void* 中的pthread_create

更多详情请查看此答案:How to assign unique ids to threads in a pthread wrapper?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多