rH Linuxでは、すべてのpthreadがpidにマッピングされており、htopなどのツールで監視できます。しかし、どうすればスレッドのpidを取得できますか? getpid()はメインスレッドのPIDを返すだけです。
呼び出し元のスレッドのIDを返すために呼び出すことができます。
また、PIDはプロセスIDです。スレッドには、PIDではなくスレッドIDがあります。同じプロセスで実行されているすべてのスレッドは、同じPIDを持ちます。
混乱する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);
}
PIDはプロセスIDであり、スレッドIDではありません。同じプロセスで実行されているスレッドは明らかにすべて同じPIDに関連付けられます。
Pthreadは移植可能であるため、基になるOSスレッドのIDを直接取得することはできません。基盤となるOSスレッドがない可能性もあります。
pthread_selfはtidを取得しませんnot。これは、pthread関数で使用するためのタイプpthread_tのハンドルまたはポインターを提供します。
実際のプログラムが返す可能性のある例については、ここを参照してください。
実際には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;
}
あなたが探している関数は pthread_self だと思います
スレッドにはtid(threadIds)があり、すべてのスレッドは同じプロセス(pid)で実行されます。したがって、スレッドが同じプロセスで作成されていると仮定すると、スレッドはすべて同じpidを持つ必要がありますが、tidは異なります。
pthread_self()はtidを提供し、getpid()はpidを取得します。