1. ホーム
  2. c++

[解決済み] pthread_t の表示方法

2022-03-02 15:36:33

質問

検索してみたが、納得のいく答えに出会えない。

pthread_t を表示するポータブルな方法がないことは知っています。

アプリではどうやるんですか?

更新してください。

実は、pthread_tは必要ないのですが、デバッグメッセージで異なるスレッドを識別するための小さな数字idが必要です。

私のシステム(64ビット版RHEL5.3)では、これはunsigned long intとして定義されているので、大きな数字であり、それを表示するだけでデバッグ行の貴重な場所を食ってしまうのです。どのように gdbの割り当て short tids?

解決方法は?

これは、16進数で表示される pthread_t が、実際には何であるかにかかわらず。

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]));
  }
}

それぞれについて小さなIDを表示するだけなら pthread_t のようなものが使えると思います(今回はiostreamsを使用)。

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) {
  ...
}