记录线程id的最后八个字符?

时间:2011-03-12 04:51:56

标签: c++ multithreading

在我的多线程程序中,我正在记录进程ID和线程ID。线程id是使用pthread_self()函数生成的。当我用十六进制打印时,通常它有12个字符,其中前四个总是常见的,我不想记录它们。

C ++中打印最后8个字符的最佳方法是什么,我尝试使用boost :: format但无法弄清楚如何打印最后8个字符。

e.g 这里打印进程id为十进制,线程id为十六进制。

 std::cout << boost::format("%5d|%8X") %getpid() %pthread_self()

我已经使用以下解决方案,但我不喜欢幻数10000000000

std::cout << boost::format("%5d|%8X") %getpid() %(pthread_self()%10000000000)

注意:为简单起见,我在这里使用了std :: cout。在我的应用程序中,我使用boost :: log,所以如果有办法使用boost日志,那是首选。

以下是一个示例:7f08很常见,在调试时不会添加任何值。

14833 | 7f084b7fe700

14833 | 7f084bfff700

14833 | 7f0850dec700

14833 | 7f08515ed700

14833 | 7f0851dee700

14833 | 7f08525ef700

14833 | 7f0852df0700

14833 | 7f08535f1700

3 个答案:

答案 0 :(得分:3)

你的魔法常数应该是十六进制:

pthread_self() & 0xffffffff

这使得底部8位十六进制数字中的位不变,但将高位十六进制数字中的位设置为0.然后应该禁止它们,因为您没有指定前导0打印。

答案 1 :(得分:2)

1)在堆栈上声明char [13]变量 2)sprintf你的线程ID是%x形式
3)然后,如果你把一个指针指向数组的第4个元素,它将是你的8字符串 - 你可以通过任何你喜欢的方式记录它

答案 2 :(得分:0)

将计算放在一个名为last_part_of_thread_id()的新函数中。然后代码在这样的函数中看起来不会那么神奇。