2017-12-14 48 views
7

pthread_tの値(pthread_create()またはstd::thread::native_hanle()から返されたもの)をLinuxのpid(tid)にマップする方法はありますか?誰かが重複して幸せになる前に、これはではなく、で、スレッド自身のPIDを見つけることです(これはgettid()で行うことができます)。pthread_tをpidにマップする方法(Linuxの場合)

微妙なやり方は、何とかスレッドを強制してgettid()を呼び出し、結果を渡すことですが、それはあまりにも多くのトラブルです。

私が考えている可能性のあるアプリケーションの1つは、プログラム内で作成されたスレッド(pthread_tが利用可能)をps -Tによって提供される出力と照合することです。

+3

私が知る限り、linuxでは、 'pthread_t'は' struct pthread'へのポインタで、 'tid'メンバを持っています。しかし、私はこの情報を読むための許容可能な方法を知らない。使用可能なデバッグシンボルがある場合、gdbの 'ptype pthread'でこの構造体をチェックすることができます。デバッグのためだけに、 'tid'のオフセットを' p&((pthread *)0) - > tid'で読み込み、プログラム自体でこのオフセットを使って 'pthread_t'から' tid'を読み込むことができます。または、シンボルファイル自体からのオフセットを、いくつかの矮星リーダーライブラリで読み込み、 "移植可能"にすることができます。 – geza

+0

@geza非常に興味深いことに、この情報をありがとう! – SergeyA

+0

それはスレッドの実装の下に依存します。 linuxthreadsにプロセスIDが関連付けられている可能性があります。 'getpid'はそれを返すべきです。 posixスレッドはそうでないかもしれないので、 'getpid'はメインプロセスのPIDを返します。これを確認してください:https://stackoverflow.com/a/19677227/1143850 – Serge

答えて

3

ワン(複雑、非ポータブルLinux特有の、軽く破壊)は次のようstruct pthreadに見もせずtidへのマッピングpthread_tの方法は次のとおりです。

  1. 使用​​をスレッド名をユニークなものに設定する。
  2. /proc/self/taskのサブディレクトリに反復処理を行い、それぞれにcommという名前のファイルから行を読み込みます。
  3. 使用した一意の文字列と行が等しい場合は、サブディレクトリ名の最後の要素からtidを抽出します。これがあなたの答えです。

スレッド名はOSによって何も使用されていないため、変更するのが安全です。それにもかかわらず、元の値に戻すことをお勧めします(入手するにはpthread_getname_npを使用してください)。

+0

実際、私のスレッドにはすでに名前があるので、このアプローチは確かに検討する価値があります。受諾する。 – SergeyA

-1

PthreadsはPOSIXスレッドです。 では、pthread_tは、アーキテクチャによってはlong型のtypedefです。 実際には、上で述べたように内部構造体pthreadに型キャストされたポインタです。

struct pthreadが返されないようにしています。 スレッディングは、基礎となるOSに大きく依存します。スレッドは、すべてのUnix風味のOSに均等に実装されていません。 私はgettidがPOSIX関数であるとは思っていませんが、Linux固有のものだと思います。あなたは、構造体のpthread のlinuxの具体的な実施のためのglibc/NPTLのソースコードを見てすることができます

https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/descr.h;h=fdeb397eab94730a5dab3181abcdae815ed6914e;hb=48a8f8328122ab8d06b7333cb87be46feeaf7cca

を参照してくださいしかし、私は、あなたが探していることはGETPIDであると考えています。これは、プロセスIDであるとidスレッドではない

関連する問題