web-dev-qa-db-ja.com

Linux CプログラムでpthreadのスレッドIDを取得する方法は?

Linux Cプログラムで、pthreadライブラリによって作成されたスレッドのスレッドIDを印刷する方法は?
例:プロセスのpidを取得するには、getpid()を使用します。

71
Ravi Chandra

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);
68
Abhitesh khatri

何?その人はLinux固有の、そしてgetpid()に相当するものを求めました。 BSDやAppleではありません。答えはgettid()であり、整数型を返します。次のように、syscall()を使用して呼び出す必要があります。

#include <sys/types.h>
#include <sys/syscall.h>

 ....

 pid_t x = syscall(__NR_gettid);

これはLinux以外のシステムには移植できないかもしれませんが、threadidは直接匹敵し、非常に高速に取得できます。通常の整数のように(LOGなどの)印刷できます。

52
Evan Langlois
pid_t tid = syscall(SYS_gettid);

Linuxは、スレッドのIDを取得できるように、このようなシステムコールを提供します。

8
Weiqi Gu

他の回答で述べたように、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がプロセスのメイン(最初の)スレッドであるかどうかはどうすればわかりますか?

8
bleater

pthread_self()を使用できます

pthread_create()が正常に実行された後、親はスレッドIDを知るようになりますが、スレッドIDにアクセスしたい場合はスレッドを実行するときに、関数pthread_self()を使用する必要があります。

8
Jeff

pthread_getthreadid_npは私のMac OS Xではありませんでした。 pthread_tは不透明(OPAQUE)型です。頭をbeatらないでください。それをvoid*に割り当てて、それを適切に呼び出します。 printfが必要な場合は、%pを使用してください。

3
user2074102

この1行で、pid、各threadidおよびspidが得られます。

 printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
3
nandan

スレッド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
}
2

疑問が明確ではないだけでなく、ほとんどの人は違いを認識していないと思います。次のことわざを調べて、

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");
1
snr

プラットフォームに依存しない方法(c ++ 11以降)は次のとおりです。

#include <thread>

std::this_thread::get_id();
0
Oleg Oleg