搜索过,但没有找到满意的答案。
我知道没有可移植的方式来打印pthread_t。
您如何在您的应用程序中做到这一点?
更新:
实际上,我不需要pthread_t,但是需要一些小的数字ID,以便在调试消息中标识不同的线程。
在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它的数量很大,仅打印它就在调试行中占据了宝贵的位置。 gdb 如何 分配 短消息?
pthread_t不管实际是什么,这都会打印出a的十六进制表示形式:
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<for pthread_t,因为std::map需要对元素进行排序:
operator<
std::map
bool operator<(const pthread_t &left, const pthread_t &right) { ... }