在同一进程中处理线程的id

时间:2014-07-05 18:37:23

标签: c linux pthreads

以下代码用于打印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不同,线程是作为进程实现的吗?

2 个答案:

答案 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与某些系统实用程序的关系,例如pshtop。二,实际上有一些linux特定的系统调用,其中linux tid非常有用。