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

pthread_t を出力する方法

これは 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 つの整数) をプログラム内の各スレッドに関連付けます。

各スレッド内に一意の番号を出力することを検討している場合、最もクリーンなオプションは、開始時に使用する番号を各スレッドに伝えることでしょう。


Linux
  1. 各50行から15行目と25行目を印刷する方法は?

  2. C プログラムでスレッドを終了する方法 ( pthread_exit の例 )

  3. ブロッキング IO でハングしているスレッドに参加するには?

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

  2. Linux pthreads でスレッドの名前を設定するには?

  3. アセンブリNASMで数値を出力するには?

  1. psを印刷グループにするにはどうすればよいですか?

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

  3. Linuxコマンド出力をファイルに出力するには?