【问题标题】:How to get pid from pthread如何从 pthread 获取 pid
【发布时间】:2011-09-01 13:39:42
【问题描述】:

在 RH Linux 中,每个 pthread 都映射到一个 pid,可以在 htop 等工具中对其进行监控。但是我怎样才能得到一个线程的pid? getpid() 只是返回主线程的pid。

【问题讨论】:

  • Linux 2.6 replaced LinuxThreads with NPTL,Linux 现在遵循 POSIX 并为每个线程正确返回相同的 PID。
  • 您应该考虑“接受”您认为有用的答案。
  • Steve-o:也许是这样,但是 linux 仍然为每个线程创建一个单独的进程(每个线程都有自己的 /proc/,其中 与主线程/进程不同)

标签: c++ linux pthreads


【解决方案1】:

有两个线程值会混淆。 pthread_self() 将返回 POSIX 线程 ID; gettid() 将返回操作系统线程 ID。后者是特定于 linux 的,不保证可移植,但可能是您真正想要的。

EDIT 正如 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);
   }

【讨论】:

  • 注意gettid()没有glibc封装,需要通过syscall()调用
  • @ PlasmaHH - 对,我应该补充一下。幸运的是,系统调用手册页以它为例。
  • @Maxim:有趣的是,新维护者重新打开了引用的 glibc 问题。
  • @NathanKidd 是的,老维护者并没有过度合作)
【解决方案2】:

pthread_self();

可以调用返回调用线程的ID。

PID 也是进程 ID,线程的线程 ID 不是 PID。在同一进程中运行的所有线程将具有相同的 PID。

【讨论】:

  • Als 否决票是因为您所说的是错误的。 Linux 线程实际上可以用 pid 表示,因为它们是轻量级进程。事实上,Linux unistd.h 中存在以下函数:pid_t gettid(void)。另一方面,Windows 具有真正独立的线程 ID。
【解决方案3】:

PID 是进程 ID,而不是线程 ID。在同一个进程上运行的线程显然都与同一个 PID 相关联。

因为 pthreads 试图是可移植的,所以您无法直接获取底层 OS 线程的 ID。甚至可能没有底层操作系统线程。

【讨论】:

  • 或者更确切地说,因为 NPTL 线程不再注册为进程。
【解决方案4】:

pthread_self 得到 tid。它提供了一个 pthread_t 类型的句柄或指针,以便在 pthread 函数中使用。

请参阅此处了解真实世界程序可能返回的示例:

http://www.c-plusplus.de/forum/212807-full

【讨论】:

    【解决方案5】:

    实际上 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;
    }
    

    【讨论】:

      【解决方案6】:

      线程有 tids (threadIds),所有线程都运行在同一个进程 (pid) 中。因此,假设它们是在同一个进程中创建的,您的线程应该都具有相同的 pid,但它们会有不同的 tid。

      pthread_self() 给出 tid,getpid() 得到 pid。

      【讨论】:

        【解决方案7】:

        我想你要找的函数是pthread_self

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-16
          • 2015-06-23
          • 2014-04-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多