是否有一种明智的方法可以将pthread_t
值(从pthread_create()
或std::thread::native_hanle()
返回)映射到Linux中的pid(tid)?在某人获得重复开心之前,这是不关于查找线程自己的pid(可以使用gettid()
完成)。
疯狂的方式是以某种方式迫使线程调用gettid()
并传递结果,但这太麻烦了。
我想到的一个可能的应用是协调在程序中创建的线程(pthread_t
可用的地方)与ps -T
提供的输出。
答案 0 :(得分:3)
将pthread_t
映射到tid
而不查看struct pthread
的一种(复杂的,不可移植的,特定于Linux的,轻度破坏性的)方法如下:
pthread_setname_np
将线程名称设置为唯一的。/proc/self/task
的子目录,并从每个文件中名为comm
的文件中读取一行。tid
。这是你的答案。 操作系统不会将线程名称用于任何内容,因此更改它应该是安全的。不过,您可能希望将其设置回原来的值(使用pthread_getname_np
来获取它)。
答案 1 :(得分:0)
在 Linux 上使用 process_vm_readv
系统调用是一种有点老套的方法。如果您知道 pthread_t
,请使用它将内存从远程进程复制到本地缓冲区,然后将指针转换为 struct pthread
并检索 tid
字段的值。
答案 2 :(得分:-1)
Pthreads是POSIX线程。 在pthread_t中,某种类型的long的typedef取决于您的体系结构。 它实际上是一个指向内部struct pthread的指针,如上所述。
故意不返回struct pthread。 线程高度依赖于底层操作系统。所有Unix风格的操作系统都没有平等地实现线程。 我甚至不相信gettid是POSIX函数,我相信它是特定于Linux的。
您可以查看glibc / nptl源代码,了解linux pthread的linux特定实现 见https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca
但我相信你所寻找的是getpid。它是进程ID而不是线程ID