2017-01-06 6 views
2

Linuxでは、スレッドはpthread_tまたはTIDによって識別されます。私は、スレッドIDのこの2種類の間に橋を探しています:LinuxのスレッドTIDとpthread_tの "スレッドID"をリンクする方法はありますか

  • pthread_tが、私はそれがTIDだ得ることができます与えられましたか? pthreadの内部にハッキングなしapparentlyない:(私はまだケースに求めている誰かがそれを行うにはきれいな方法があります。
  • TID(またはPID)与えられたが、私はそれにpthread_tハンドルを得ることができますか?

用語「スレッドID」は、この文脈では曖昧であるため(およびドキュメントに)、バックグラウンドのビット:

  • POSIXのpthreadのAPIはpthread_tタイプ、らを定義l関数は、スレッドに対してクエリ/アクションが引数pthread_tを使用しており、そのようなハンドルを得ることができます。 pthread_self()となります。ドキュメントではこれらの「スレッドID」を呼び出していますが、複数の異なるpthread_tの値が同じスレッドを表す可能性があるため、曖昧さ回避のためにハンドルと呼びます。したがって、pthread_equal(pthread_t, pthread_t)が必要です。

  • 一方、少なくともLinuxでは、TIDやスレッドIDという概念があります。システムコール:syscall(SYS_gettid)で現在のTIDを得ることができます。 TIDは残念ながら、そうするための何のポータブルな方法がありません

+0

あなたは 'TID'をどうするつもりですか? –

+0

@MaximEgorushkin:簡単なデバッグ/トレース(ユニークなので)、メインスレッド上での操作を別のものから行うか、pthreadで抽象化されていないLinux固有のスレッド関数を使用します。 – Antoine

答えて

2

など、そのようなスレッドに固有のものとして、いくつかの興味深い特性を有し、かつ簡単にメインスレッドを識別することができますPID秒、に匹敵しますthere is no requirement for pthread_t to map to tid

実装では、スレッドIDを構造体として定義することができます。これにより、intを使用するより柔軟性と堅牢性が向上します。例えば、スレッドIDは、「ダングリングID」(切り離されたスレッドIDのコピー)の検出を可能にするシーケンス番号を含むことができる。 C言語は構造体型の比較をサポートしていないため、pthread_equal()関数を使用してスレッドIDを比較します。

歴史的には、前NPTLに、pthread_tは1対1 tidにマップしませんでした。

tidでピークを表示するには、pthreadsライブラリ実装の詳細を使用する必要があります。そのようなコードは移植性がないので、私はそれをすることをお勧めしません。唯一の好奇心の便宜上

、glibcのと、pthread_t is a struct pthread *

27 int 
28 __pthread_kill (pthread_t threadid, int signo) 
29 { 
30 struct pthread *pd = (struct pthread *) threadid; 
... 
40 pid_t tid = atomic_forced_read (pd->tid); 

そしてpthread is

122 /* Thread descriptor data structure. */ 
123 struct pthread 
124 { 
... 
166 /* Thread ID - which is also a 'is this thread descriptor (and 
167  therefore stack) used' flag. */ 
168 pid_t tid; 
+0

悲しいことですが、とにかくglibcの例に感謝します。それ以外の方法はどうでしょうか?pid/tidから 'pthread_t'を得るための秘訣はありますか? – Antoine

+1

'extern struct pthread * __ find_thread_by_id(pid_t tid)attribute_hidden'、属性に注意してください。また、 'struct pthread * self = THREAD_SELF;' –

関連する問題