【问题标题】:logging last eight character of the thread id?记录线程ID的最后八个字符?
【发布时间】:2011-03-12 04:51:56
【问题描述】:

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

在 C++ 中打印最后 8 个字符的最佳方法是什么,我尝试使用 boost::format 但不知道如何打印最后 8 个字符。

例如 这里打印十进制的进程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 log,那是首选。

这里是一个例子:7f08很常见,在调试中没有任何价值。

14833|7f084b7fe700

14833|7f084bfff700

14833|7f0850dec700

14833|7f08515ed700

14833|7f0851dee700

14833|7f08525ef700

14833|7f0852df0700

14833|7f08535f1700

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

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

    pthread_self() & 0xffffffff
    

    这允许底部 8 个十六进制数字中的位不变地通过,但将较高十六进制数字中的位设置为 0。然后它们应该被禁止,因为您没有指定前导 0 打印。

    【讨论】:

    • 这是比我更好的解决方案,但我仍在寻找是否有办法设置/格式化宽度并仅打印最后 8 个字符。
    • 必须额外执行上述步骤或进行字符串操作。格式化程序不是为此而设计的。
    【解决方案2】:

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

    【讨论】:

    • 如果前导字符为零,这将失败,因为结果将向左移动。
    • 同意。 +1 对您的优雅回答 :)
    【解决方案3】:

    将计算放入一个正确命名的新函数中,例如last_part_of_thread_id()。那么代码在这样的函数中就不会那么神奇了。

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 1970-01-01
      • 2018-11-06
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2016-03-01
      相关资源
      最近更新 更多