thread_t 数组 linux,首页> C#>如何打印pthread_t

好的,这似乎是我的最终答案。 我们有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未知,则创建新条目,以便生成/使用新索引。

优点是简单。 缺点是无法跟踪线程的创建/销毁。 因此,要跟踪此情况,需要一些外部机制。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值