好的,这似乎是我的最终答案。 我们有2个实际问题:
如何获取较短的唯一ID以供线程记录。
无论如何,我们需要为线程打印真实的pthread_t ID(至少链接到POSIX值)。
1.打印POSIX ID(pthread_t)
您可以简单地将pthread_t视为字节数组,并为每个字节打印十六进制数字。 因此,您不受某些固定大小类型的限制。 唯一的问题是字节顺序。 您可能喜欢打印字节的顺序与简单的“ int”打印顺序相同。 这是little-endian的示例,并且big-endian仅应还原顺序(在define?下):
#include
#include
void print_thread_id(pthread_t id)
{
size_t i;
for (i = sizeof(i); i; --i)
printf("%02x", *(((unsigned char*) &id) + i - 1));
}
int main()
{
pthread_t id = pthread_self();
printf("%08x\n", id);
print_thread_id(id);
return 0;
}
2.获得较短的可打印线程ID
在任何建议的情况下,您都应将实际线程ID(posix)转换为某些表的索引。 但是有两种明显不同的方法:
2.1。 跟踪线程。
您可以跟踪表中所有现有线程的线程ID(应该包装它们的pthread_create()调用),并具有“重载”的id函数,该函数仅使您获得表索引,而不是实际的线程ID。 此方案对于任何内部线程相关的调试资源跟踪也非常有用。 明显的优势是线程级跟踪/调试功能的副作用,并可能在将来进行扩展。 缺点是必须跟踪任何线程的创建/销毁。
这是部分伪代码示例:
pthread_create_wrapper(...)
{
id = pthread_create(...)
add_thread(id);
}
pthread_destruction_wrapper()
{
/* Main problem is it should be called.
pthread_cleanup_*() calls are possible solution. */
remove_thread(pthread_self());
}
unsigned thread_id(pthread_t known_pthread_id)
{
return seatch_thread_index(known_pthread_id);
}
/* user code */
printf("04x", thread_id(pthread_self()));
2.2。 只需注册新的线程ID。
在记录期间调用pthread_self()并搜索内部表(如果它知道线程)。如果创建了具有此类ID的线程,则使用其索引(或从以前的线程重复使用,实际上没关系,因为同一时间没有2个相同的ID)。 如果线程ID未知,则创建新条目,以便生成/使用新索引。
优点是简单。 缺点是无法跟踪线程的创建/销毁。 因此,要跟踪此情况,需要一些外部机制。