一尘不染

如何打印pthread_t

linux

搜索过,但没有找到满意的答案。

我知道没有可移植的方式来打印pthread_t。

您如何在您的应用程序中做到这一点?

更新:

实际上,我不需要pthread_t,但是需要一些小的数字ID,以便在调试消息中标识不同的线程。

在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它的数量很大,仅打印它就在调试行中占据了宝贵的位置。
gdb 如何 分配 短消息?


阅读 1269

收藏
2020-06-02

共1个答案

一尘不染

pthread_t不管实际是什么,这都会打印出a的十六进制表示形式:

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<for
pthread_t,因为std::map需要对元素进行排序:

bool operator<(const pthread_t &left, const pthread_t &right) {
  ...
}
2020-06-02