没有系统调用如何获取线程ID?并且获取系统时间与使用系统调用获取线程ID相比更少或更多?

时间:2014-03-15 17:44:29

标签: c multithreading logging system-calls systemtime

我的应用程序我有一个日志包装类和像LOG_DEBUG(消息),LOG_ERROR(消息)等宏。当我使用例如LOG_DEBUG(消息)时,它打印时间,消息和代表调试的字母D.我想要做的是向宏添加打印执行LOG命令的线程id的功能。首先我将syscall(SYS_gettid)添加到日志包装器类中,这没问题,我的问题是,如果没有系统调用,我可以这样做吗?

我虽然使用线程本地存储来在用户空间中存储地图中的线程id,其中的键由pthread_key_create给出,但我想知道是否还有其他一些我没想到的方法。

在尝试弄清楚的时候,我注意到使用strace为了得到时间我实际上正在调用系统调用,因此对于每个日志,我得到一个上下文切换。我想不出一种绕过这种方法的方法,但我想知道通过系统调用获取线程ID是否比获取系统时间少得多,多或几乎相同。

1 个答案:

答案 0 :(得分:0)

最后,我使用了线程本地存储的gcc实现,请参阅this以获取更多详细信息。

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