以下代码用于打印2个线程的进程ID linux(ubuntu 14.04)
#include<pthread.h>
#include<stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
/* Spin forever. */
while (1);
return NULL;
}
int main ()
{
pthread_t thread;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
pthread_create (&thread, NULL, &thread_function, NULL);
/* Spin forever. */
while (1);
return 0;
}
输出
main thread pid is 3614
child thread pid is 3614
但是,自GNU / Linux以来,不应该是进程ID不同,线程是作为进程实现的吗?
答案 0 :(得分:7)
这里有一个术语冲突。就Linux内核而言,每个线程都是一个独立的进程。因此,Linux为每个线程分配一个新的PID。
但这不是POSIX的工作原理:根据POSIX,进程中的所有线程都应共享相同的PID。 Linux内核调用此“线程组ID”(TGID),并且getpid()函数实际返回TGID,以便符合POSIX。
答案 1 :(得分:3)
三个独立的概念:进程id(getpid
),pthreads线程id(pthread_self
)和底层linux线程id(gettid
)。
gettid
没有glibc包装,所以它等于这个
pid_t gettid(void)
{
return(syscall(SYS_gettid));
}
在常见的pthreads编程级别上,你不应该关心线程是如何实现的(尽管pdw解释得很好)。所有这些都是故意不透明的。在任何pthreads函数中都没有gettid
。它们都需要pthreads线程id。
人们询问有关linux线程ID的原因主要有两个。一,他们想要了解linux线程id与某些系统实用程序的关系,例如ps
,htop
。二,实际上有一些linux特定的系统调用,其中linux tid非常有用。