web-dev-qa-db-ja.com

pthreadからpidを取得する方法

rH Linuxでは、すべてのpthreadがpidにマッピングされており、htopなどのツールで監視できます。しかし、どうすればスレッドのpidを取得できますか? getpid()はメインスレッドのPIDを返すだけです。

11
Shawn

pthread_self();

呼び出し元のスレッドのIDを返すために呼び出すことができます。

また、PIDはプロセスIDです。スレッドには、PIDではなくスレッドIDがあります。同じプロセスで実行されているすべてのスレッドは、同じPIDを持ちます。

6
Alok Save

混乱する2つのスレッド値があります。 pthread_self() はPOSIXスレッドIDを返します。 gettid() はOSスレッド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);
   }
25
Duck

PIDはプロセスIDであり、スレッドIDではありません。同じプロセスで実行されているスレッドは明らかにすべて同じPIDに関連付けられます。

Pthreadは移植可能であるため、基になるOSスレッドのIDを直接取得することはできません。基盤となるOSスレッドがない可能性もあります。

pthread_selfはtidを取得しませんnot。これは、pthread関数で使用するためのタイプpthread_tのハンドルまたはポインターを提供します。

実際のプログラムが返す可能性のある例については、ここを参照してください。

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

1
alex

実際には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;
}
1
jayadev

あなたが探している関数は pthread_self だと思います

0
Aif

スレッドにはtid(threadIds)があり、すべてのスレッドは同じプロセス(pid)で実行されます。したがって、スレッドが同じプロセスで作成されていると仮定すると、スレッドはすべて同じpidを持つ必要がありますが、tidは異なります。

pthread_self()はtidを提供し、getpid()はpidを取得します。