在我的多线程程序中,我正在记录进程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
答案 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()
的新函数中。然后代码在这样的函数中看起来不会那么神奇。