GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

 ....

 pid_t x = syscall(__NR_gettid);

これは Linux 以外のシステムには移植できないかもしれませんが、threadid は直接比較可能であり、非常に高速に取得できます。通常の整数のように出力できます (LOG など)。


他の回答で述べたように、pthreads はプラットフォームに依存しない統合スレッド 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 がプロセスのメイン (最初の) スレッドかどうかを確認できますか?.


pid_t tid = syscall(SYS_gettid);

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


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
  1. C プログラムでスレッドを終了する方法 ( pthread_exit の例 )

  2. Linux でスレッドを作成する方法 (C サンプル プログラムを使用)

  3. Linuxでディレクトリサイズを取得する方法

  1. Linuxでスレッドに名前を付ける方法は?

  2. AVR - Linux で AVR チップをプログラムする方法

  3. bashからネットマスクを取得するには?

  1. IP (Linux) からホスト名を取得するには?

  2. Linuxでプログラムがスタックしている場所を知る方法は?

  3. Scientific Linux で ldapsearch を取得するには?