Linux Cプログラムで、pthreadライブラリによって作成されたスレッドのスレッドIDを印刷する方法は?
例:プロセスのpidを取得するには、getpid()
を使用します。
pthread_self()
関数は、現在のスレッドのスレッドIDを提供します。
pthread_t pthread_self(void);
pthread_self()
関数は、呼び出しスレッドのPthreadハンドルを返します。 pthread_self()関数は、呼び出しスレッドの統合スレッドを返しません。 pthread_getthreadid_np()
を使用して、スレッドの整数識別子を返す必要があります。
注意:
pthread_id_np_t tid;
tid = pthread_getthreadid_np();
これらの呼び出しよりも大幅に高速ですが、同じ動作を提供します。
pthread_id_np_t tid;
pthread_t self;
self = pthread_self();
pthread_getunique_np(&self, &tid);
何?その人はLinux固有の、そしてgetpid()に相当するものを求めました。 BSDやAppleではありません。答えはgettid()であり、整数型を返します。次のように、syscall()を使用して呼び出す必要があります。
#include <sys/types.h>
#include <sys/syscall.h>
....
pid_t x = syscall(__NR_gettid);
これはLinux以外のシステムには移植できないかもしれませんが、threadidは直接匹敵し、非常に高速に取得できます。通常の整数のように(LOGなどの)印刷できます。
pid_t tid = syscall(SYS_gettid);
Linuxは、スレッドのIDを取得できるように、このようなシステムコールを提供します。
他の回答で述べたように、pthreadは、プラットフォームに依存しない方法で統合スレッドIDを取得する方法を定義していません。
Linuxシステムでは、次のようにしてスレッドIDを取得できます。
#include <sys/types.h>
pid_t tid = gettid();
多くのBSDベースのプラットフォームでは、この答え https://stackoverflow.com/a/21206357/316487 は移植性のない方法を提供します。
ただし、スレッドIDが必要だと思う理由が、制御している別のスレッドと同じスレッドで実行されているのか、別のスレッドで実行されているのかを知るためである場合は、このアプローチで何らかのユーティリティを見つけることができます
static pthread_t threadA;
// On thread A...
threadA = pthread_self();
// On thread B...
pthread_t threadB = pthread_self();
if (pthread_equal(threadA, threadB)) printf("Thread B is same as thread A.\n");
else printf("Thread B is NOT same as thread A.\n");
あなたがメインスレッドにいるかどうかを知る必要がある場合、この質問への回答に記載されている追加の方法があります pthread_selfがプロセスのメイン(最初の)スレッドであるかどうかはどうすればわかりますか? 。
pthread_self()
を使用できます
pthread_create()
が正常に実行された後、親はスレッドIDを知るようになりますが、スレッドIDにアクセスしたい場合はスレッドを実行するときに、関数pthread_self()
を使用する必要があります。
pthread_getthreadid_np
は私のMac OS Xではありませんでした。 pthread_t
は不透明(OPAQUE)型です。頭をbeatらないでください。それをvoid*
に割り当てて、それを適切に呼び出します。 printf
が必要な場合は、%p
を使用してください。
この1行で、pid、各threadidおよびspidが得られます。
printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
スレッドIDを取得する別の方法もあります。スレッドを作成しながら
int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);
関数呼び出し;最初のパラメーターpthread_t * thread
は、実際にはスレッドID(bits/pthreadtypes.hで定義されている符号なしlong int)です。また、最後の引数void *arg
は、スレッド化されるvoid * (*start_routine)
関数に渡される引数です。
複数の引数を渡す構造体を作成し、構造体へのポインターを送信できます。
typedef struct thread_info {
pthread_t thread;
//...
} thread_info;
//...
tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS);
//...
pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]);
//...
void *handler(void *targs) {
thread_info *tinfo = targs;
// here you get the thread id with tinfo->thread
}
疑問が明確ではないだけでなく、ほとんどの人は違いを認識していないと思います。次のことわざを調べて、
POSIXスレッドIDは、Linux固有の
gettid()
システムコールによって返されるスレッドIDとは異なります。 POSIXスレッドIDは、スレッド実装によって割り当てられ、維持されます。gettid()
によって返されるスレッドIDは、カーネルによって割り当てられた番号(プロセスIDと同様)です。 各POSIXスレッドはLinux NPTLスレッドの実装で一意のカーネルスレッドIDを持っていますが、アプリケーションは一般にカーネルIDを知る必要はありません(依存する場合は移植できません)それらを知っている)抜粋: Linuxプログラミングインターフェイス:LinuxおよびUNIXシステムプログラミングハンドブック、Michael Kerrisk
私見、昇順で番号を保持する変数を定義する構造を渡す唯一のポータブルな方法があります。スレッドごとに1,2,3...
。これにより、スレッドのIDを追跡できます。それでも、 int pthread_equal(tid1, tid2)
関数を使用する必要があります。
if (pthread_equal(tid1, tid2)) printf("Thread 2 is same as thread 1.\n");
else printf("Thread 2 is NOT same as thread 1.\n");
プラットフォームに依存しない方法(c ++ 11以降)は次のとおりです。
#include <thread>
std::this_thread::get_id();