これは pthread_t
の 16 進表現を出力します。 、それが実際に何であれ:
void fprintPt(FILE *f, pthread_t pt) {
unsigned char *ptc = (unsigned char*)(void*)(&pt);
fprintf(f, "0x");
for (size_t i=0; i<sizeof(pt); i++) {
fprintf(f, "%02x", (unsigned)(ptc[i]));
}
}
pthread_t
ごとに小さな ID を出力するには このようなものを使用できます (今回は iostream を使用):
void printPt(std::ostream &strm, pthread_t pt) {
static int nextindex = 0;
static std::map<pthread_t, int> ids;
if (ids.find(pt) == ids.end()) {
ids[pt] = nextindex++;
}
strm << ids[pt];
}
プラットフォームと pthread_t
の実際の表現に応じて ここで operator<
を定義する必要があるかもしれません pthread_t
の場合 、なぜなら std::map
要素の順序付けが必要です:
bool operator<(const pthread_t &left, const pthread_t &right) {
...
}
Linux では、GDB は短い番号にスレッド ID (別名カーネル pid、別名 LWP) を使用します。試してみてください:
#include <syscall.h>
...
printf("tid = %d\n", syscall(SYS_gettid));
この場合、POSIX 標準では pthread_t
が不要になったため、オペレーティング システムによって異なります。 算術型であること:
IEEE Std 1003.1-2001/Cor 2-2004、項目 XBD/TC2/D6/26 が適用され、pthread_t
が追加されます 算術型である必要のない型のリストに追加し、 pthread_t
を許可します 構造体として定義されます。
sys/types.h
を調べる必要があります ヘッダーと pthread_t
の方法を参照してください 実装されています。その後、適切と思われる方法で印刷できます。これを実行するための移植可能な方法がなく、使用しているオペレーティング システムが特定されていないため、これ以上多くを語ることはありません。
編集: 新しい質問に答えるために、GDB は新しいスレッドが開始されるたびに独自のスレッド ID を割り当てます:
<ブロック引用>デバッグの目的で、gdb は独自のスレッド番号 (常に 1 つの整数) をプログラム内の各スレッドに関連付けます。
各スレッド内に一意の番号を出力することを検討している場合、最もクリーンなオプションは、開始時に使用する番号を各スレッドに伝えることでしょう。