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


94

Linux cプログラムで、pthreadライブラリによって作成されたスレッドのスレッドIDを出力する方法は?
例:プロセスのpidを取得するにはgetpid()

回答:


82

pthread_self() 関数は現在のスレッドのスレッドIDを与えます。

このpthread_self()関数は、呼び出し元のスレッドのPthreadハンドルを返します。pthread_self()関数は、呼び出し元のスレッドの整数スレッドを返しません。を使用pthread_getthreadid_np()して、スレッドの整数識別子を返す必要があります。

注意:

これらの呼び出しよりも大幅に高速ですが、同じ動作を提供します。


37
元々の質問はLinuxについてでした。Linuxには_np関数は含まれていません。(manページは含まれていません。それ以上はチェックしませんでした。)
Trade-Ideas Philip

pthread_threadid_npは、OS X> = 10.6およびiOS> = 3.2で使用できます。
bleater 2014

@Bleaterの公式ドキュメントを提供していただけますかpthread_threadid_np。プロジェクトに使用する必要があるため、iOSおよびOSXプラットフォームでそのAPIの信頼性を確認する必要があります。opensource.apple.com/source/Libc/Libc-583/pthreads/pthread.hのリンクを参照しましたが、それらが正しいかどうかはわかりません。
Vivek Maran 2015

@Vivek公式ドキュメントへのリンクはありません。リンクするヘッダーと、opensource.apple.com
source / Libc / Libc

10
@ Trade-IdeasPhilip-明確に_npするために、ポータブルではないことを意味します。Linuxには独自の_npものがありますが、Appleのものは含まれていませんpthread_getthreadid_np
Josh Kelley 2015年

84

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

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


11
これが本当の答えでなければなりません
マシュー・S

その人はLinuxで動作する何かについて尋ねました。ポータブルな方法でそうすることは、それを行うための好ましい方法のように私には思えます。移植は何のためにカウントされない場合は、私はLinuxが本当に新しいWindows ...となってきていると思います
ジャスパーSiepkes

3
@JasperSiepkesあなたは要点を逃しています。彼は、スレッドのgetpid()と同等のLINUX呼び出しを要求しました。それがgettid()です。質問は、移植性やPOSIXについては尋ねていませんでした。質問をするのではなく、見せびらかして教えてみたいという人が多すぎます。pthread_self()はカーネルスレッドIDを返さず、簡単に印刷できるように操作できません。また、pthread_selfはポインタである可能性が高いため、pthread_equal()と比較するだけで、操作しないでください。質問はあなたが印刷できるIDを求めました、そしてそれはgettid()です。
EvanLanglois19年

3
@EvanLanglois彼はpthreadライブラリ、文字通りPOSIXスレッドライブラリを使用しています。POSIX互換の答えを作ることはそれほど奇妙ではありません。「彼は、スレッドのgetpid()と同等のLINUX呼び出しを要求しました。」いいえ、getpid()例として挙げました。セマンティクスが難しい仕様であるとは言いませんでした。Linux以外の他のコミュニティ(FreeBSD、Illumos、OS Xなど)がそれらの恩恵を受けることができるように、POSIX互換の方法で物事を行うことを人々に認識させることは、「誇示」ではありません。私が言ったように、Linuxは本当に次のWindowsになっていると思います。
JasperSiepkes20年

14

他の回答に記載されているように、pthreadsは、統合スレッドIDを取得するためのプラットフォームに依存しない方法を定義していません。

Linuxシステムでは、次のようにしてスレッドIDを取得できます。

多くのBSDベースのプラットフォームでは、この回答https://stackoverflow.com/a/21206357/316487は移植性のない方法を提供します。

ただし、スレッドIDが必要だと思う理由が、制御している別のスレッドと同じスレッドで実行しているか、別のスレッドで実行しているかを知るためである場合は、このアプローチに何らかのユーティリティが見つかる可能性があります。

メインスレッドを使用しているかどうかを知る必要がある場合は、この質問への回答に記載されている追加の方法があります。pthread_selfがプロセスのメイン(最初の)スレッドであるかどうかを確認するにはどうすればよいですか?


13

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


あたりとしてこの答え、あなたが必要#include <unistd.h>#include <sys/syscall.h>、このために。
ComFreek

9

あなたが使用することができます pthread_self()

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


7

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


3

pthread_getthreadid_np私のMacOSXにはありませんでした。 pthread_t不透明(OPAQUE)型です。頭を殴らないでください。に割り当てて、void*それを良いと呼ぶだけです。をprintf使用する必要がある場合%p


1
はい、これは機能します。必要なのはデバッグ用に印刷することだけなので、0x23423423423abcdefはtid = 1234と同じくらい役に立ちます。ありがとうございました!
チーファン

3

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

POSIXスレッドIDは、Linux固有のgettid()システムコールによって返されるスレッドIDと同じではありません。POSIXスレッドIDは、スレッドの実装によって割り当てられ、維持されます。によって返されるスレッドIDはgettid()、カーネルによって割り当てられた番号(プロセスIDと同様)です。Linux NPTLスレッドの実装では各POSIXスレッドに一意のカーネルスレッドIDがありますが、アプリケーションは通常、カーネルIDについて知る必要はありません(また、カーネルIDを知っていることに依存している場合は移植できません)。

抜粋:Linuxプログラミングインターフェイス:LinuxおよびUNIXシステムプログラミングハンドブック、Michael Kerrisk

私見ですが、1,2,3... スレッドごとなど、昇順で数値を保持する変数を定義する構造を渡すポータブルな方法は1つだけです。これを行うことにより、スレッドのIDを追跡できます。それでも、int pthread_equal(tid1, tid2)関数を使用する必要があります。


これgettid()は実際には良い提案です、ありがとう!しかし、私はここでセルゲイL.によって答えを追跡するために必要な:stackoverflow.com/a/21280941/2430526
SRG

1

スレッド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で定義されているunsigned long int)です。また、最後の引数void *argは、void * (*start_routine)スレッド化される関数に渡される引数です 。

複数の引数を渡し、構造体へのポインターを送信する構造体を作成できます。


-1

この方法で書くこともでき、それは同じことをします。例:

このプログラムは、pthread_tの配列を設定し、それぞれの合計を計算します。つまり、スレッドIDを持つ各スレッドの合計を出力しています。


それは質問に答えません、そしてコードの説明さえ間違っています!
U.Windl20年

-2

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


これはおそらくあなたが思うほど「プラットフォームに依存しない」ものではありません。私の実装では、それはに解決されますpthread_t。Macではポインタになり、Linuxでは整数になります。またtop、たとえば表示される可能性のある「ネイティブ」IDも反映されません。知っておくべきことですが、用途によっては問題ないかもしれません。
Brad Allred 2018

1
C11(質問はCに関するものでした)では、threads.hからthrd_current()を使用します
jerry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.