【问题标题】:Is APUE wrong about linux threads description?APUE 对 linux 线程描述有误吗?
【发布时间】:2012-02-14 16:47:14
【问题描述】:

在图11.2 APUE 2nd中,有一段代码演示了线程API的用法,如下:

#include <pthread.h>
#include <stdio.h>

pthread_t ntid;

void printids(const char *s)
{
        pid_t pid;
        pthread_t tid;

        pid = getpid();
        tid = pthread_self();
        printf("%s pid %u tid %u (0x%x)\n", s,
                (unsigned int)pid, (unsigned int)tid, (unsigned int)(tid));
}

void *thr_fn(void *arg)
{
        printids("new thread: ");

        return (void*)0;
}

int main(void)
{
        int err;

        err = pthread_create(&ntid, NULL, thr_fn, NULL);
        if (err != 0)
                return -1;

        printids("main thread: ");
        sleep(1);
        return 0;
}

书上说输出是这样的,

$./a.out
new thread: pid 6628 ...
main thread: pid 6626 ...

Pid 不同!这是因为“Linux使用clone()来实现线程,和fork()一样,所以系统认为线程是共享资源的独立进程”。

但是我测试的时候发现结果和APUE的结果不一样,就是

$ ./a.out 
main thread:  pid 13301 tid 3078153920 (0xb778e6c0)
new thread:  pid 13301 tid 3078151024 (0xb778db70)

pid 是一样的!那么APUE过时了吗?但是linux确实使用clone来实现线程,在linux内核中,它们被视为不同的进程。进程ID怎么一样?

【问题讨论】:

    标签: c linux multithreading linux-kernel


    【解决方案1】:

    您的版本 APUE 很可能已经过时,因为它指的是 LinuxThreads 而不是 NPTL。

    以下是 clone(2) 手册页中阐明此问题的相关部分:

    "线程组是 Linux 2.4 中添加的一项功能,用于支持共享单个 PID 的一组线程的 POSIX 线程概念。在内部,这个共享的 PID 是所谓的线程组标识符 (TGID)线程组。从 Linux 2.4 开始,对 getpid(2) 的调用返回调用者的 TGID。

    组内的线程可以通过它们的(系统范围的)唯一线程 ID (TID) 来区分。一个新线程的 TID 可以作为返回给 clone() 调用者的函数结果,并且一个线程可以使用 gettid(2) 获得它自己的 TID。"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多