0

我的应用程序有一个日志包装类和宏,如 LOG_DEBUG(message)、LOG_ERROR(message) 等。例如,当我使用 LOG_DEBUG(message) 时,它会打印时间、消息和代表调试的字母 D。我想做的是向宏添加打印执行 LOG 命令的线程 ID 的功能。起初我添加syscall(SYS_gettid)到日志包装类,这工作正常,我的问题是,我可以在没有系统调用的情况下做到这一点吗?

我虽然关于使用线程本地存储将线程ID存储在用户空间中,但我想知道是否有其他我没有想到的方法。

在试图弄清楚它时,我注意到通过使用strace它来获得我实际调​​用系统调用的时间,因此对于每个日志,我都会得到一个上下文切换。我想不出一种方法来规避这个问题,但我想知道通过系统调用获取线程 id 所花费的时间是否与获取系统时间大致相同、更多或大致相同。

4

1 回答 1

-1

最终,我使用了线程本地存储的 gcc 实现,请参阅了解更多详细信息。

我在全局范围内添加了一个 pid_t 类型的 tid 变量,但前面带有 __thread 关键字。在线程执行的函数内部,我通过调用 syscall(SYS_gettid) 分配给它的值。从那一刻起 tid 具有正确的值,并且从每个线程您可以直接将其作为全局变量访问,但它对每个线程都有自己的副本。我要做的最后一件事是将 tid 添加到 LOG 宏中。这完全解决了这个问题,不需要复杂的posix线程API。

于 2014-03-26T11:28:07.063 回答