Home Tags About

Linux: 线程的 PID 和 TID

23 Feb 2012
thread linux

在 Linux 内核实现当中,Linux 线程是使用 进程 实现的,所以从内核的角度看,跟进程其实区别不大,都是 runnable task ,只是与父进程所共享的东西和方式不一样。

子进程会有自己独立的文件句柄、内存等资源,并使用 COW (写时拷贝)技术进行最大限度的优化;而线程则与父进程共享访问资源。

值得注意的是,在 2.4 及以前的内核版本中,在子线程和主线程中调用 getpid 得到的值是不一样的,表示其属于不同进程。另外,通过 ps 命令查看,会发现还会多出一个线程,叫做 Manager Thread,是由系统在程序第一次调用 pthread_create 时自动产生的)。

在后来的版本当中,可能是为了兼容 POXIS 标准,改成了所有线程调用 getpid 所返回的值一致。因此,ps 也就只能看到一个进程了。可以使用 gettid 来返回所谓的 Thread ID,其实应该就是之前的 pid 了。

注: gettid 可能需要自己实现::

  pid_t gettid()
  {
       return syscall(SYS_gettid);
  }