如何打印pthread

搜索,但没有遇到一个令人满意的答案。

我知道没有一种便携的方式来打印pthread_t。

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

更新:

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

在我的系统(64位RHEL 5.3)中,它被定义为unsigned long int,所以它是大数字,只是打印它在调试行中占据了宝贵的地方。 gdb如何分配短时间内容?


这将打印出一个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]));
  }
}

只需要为每个pthread_t打印一个小ID就可以使用(这次使用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的实际表示,可能需要为pthread_t定义一个operator<因为std::map需要对元素进行排序:

bool operator<(const pthread_t &left, const pthread_t &right) {
  ...
}

GDB在Linux上使用thread-id(又名内核pid,又名LWP)作为短号。 尝试:

  #include <syscall.h>
  ...

    printf("tid = %dn", 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将自己的线程号码(总是一个整数)与程序中的每个线程关联起来。

如果你正在寻找在每个线程中打印一个唯一的号码,你最干净的选择可能是告诉每个线程启动它时使用的号码。

链接地址: http://www.djcxy.com/p/58329.html

上一篇: How to print pthread

下一篇: Any guaranteed minimum sizes for types in C?