gpt4 book ai didi

linux - 有没有办法链接 linux 的线程 TID 和 pthread_t "thread ID"

转载 作者:太空狗 更新时间:2023-10-29 11:50:07 24 4
gpt4 key购买 nike

在 linux 上,线程由 pthread_t 或 TID 标识。我正在寻找这两种线程 ID 之间的桥梁:

  • 给定一个 pthread_t 我可以得到它的 TID 吗? apparently并非没有破解 pthread 的内部结构 :( 但我仍然在问是否有人有一个干净的方法来做到这一点。
  • 给定一个 TID(或 PID),我可以获得一个 pthread_t 句柄吗?

因为术语“线程 id”在此上下文中(以及在文档中)含糊不清,一些背景知识:

  • POSIX pthread API 定义了一个pthread_t 类型,所有查询/作用于线程的函数都使用一个pthread_t 参数,我们可以得到这样一个句柄例如使用 pthread_self()。文档将这些称为“线程 ID”,但在这里我将它们称为句柄以消除歧义,因为多个不同的 pthread_t 值可能代表同一个线程,因此需要 pthread_equal(pthread_t, pthread_t).

  • 另一方面,至少在 Linux 上,有 TID 或线程 ID 的概念。可以通过系统调用获取当前的 TID:syscall(SYS_gettid)TID 有一些有趣的属性,例如对于线程而言是唯一的,并且与 PID 相当,可以轻松识别主线程等。

最佳答案

不幸的是,没有可移植的方法,因为there is no requirement for pthread_t to map to tid :

Implementations may choose to define a thread ID as a structure. This allows additional flexibility and robustness over using an int. For example, a thread ID could include a sequence number that allows detection of "dangling IDs" (copies of a thread ID that has been detached). Since the C language does not support comparison on structure types, the pthread_equal() function is provided to compare thread IDs.

历史上,在 NPTL 之前, pthread_t 没有一对一映射到 tid

您需要使用 pthreads 库实现细节来查看 tid。我不建议这样做,因为这样的代码不可移植。

仅出于好奇,使用 glibc,pthread_t is a struct pthread * :

27 int
28 __pthread_kill (pthread_t threadid, int signo)
29 {
30 struct pthread *pd = (struct pthread *) threadid;
...
40 pid_t tid = atomic_forced_read (pd->tid);

pthread is :

122 /* Thread descriptor data structure.  */
123 struct pthread
124 {
...
166 /* Thread ID - which is also a 'is this thread descriptor (and
167 therefore stack) used' flag. */
168 pid_t tid;

关于linux - 有没有办法链接 linux 的线程 TID 和 pthread_t "thread ID",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41511459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com