在RH Linux中,每个pthread都映射到pid,可以在htop等工具中监控。但我怎么能得到线程的pid? getpid()只返回主线程的pid。
答案 0 :(得分:23)
有两个线程值混淆了。 pthread_self()将返回POSIX线程ID; gettid()将返回操作系统线程ID。后者是特定于Linux的,并不保证可移植,但可能是你真正想要的。
编辑正如PlasmaHH所说,gettid()
是通过syscall()
调用的。从syscall()
手册页:
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
int
main(int argc, char *argv[])
{
pid_t tid;
tid = syscall(SYS_gettid);
}
答案 1 :(得分:8)
答案 2 :(得分:2)
PID是进程ID,而不是线程ID。在同一进程上运行的线程显然都与相同的PID相关联。
因为pthreads试图可移植,所以无法直接获取底层OS线程的ID。甚至可能没有底层的OS线程。
答案 3 :(得分:1)
pthread_self 不获取tid。它提供了pthread_t类型的句柄或指针,用于pthread函数。
请点击此处查看真实世界计划可能返回的示例:
答案 4 :(得分:1)
实际上pthread_self
返回pthread_t
而不是您可以使用的整数线程ID,以下帮助函数将以可移植的方式在不同的POSIX系统中获取它。
uint64_t gettid() {
pthread_t ptid = pthread_self();
uint64_t threadId = 0;
memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
return threadId;
}
答案 5 :(得分:0)
我认为您正在寻找的功能是pthread_self
答案 6 :(得分:0)
线程有tids(threadIds),并且所有线程都在同一进程(pid)中运行。所以,你的线程应该都具有相同的pid,假设它们是在同一个进程中创建的,那么它们将具有不同的tid。
pthread_self()给出了tid,getpid()得到了pid。