C语言 如何得到线程id没有系统调用?获取系统时间与使用系统调用获取线程id所花费的时间是更少还是更多?



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

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

而试图找出它,我注意到通过使用strace,为了得到时间,我实际上调用一个系统调用,因此对于每个日志,我得到一个上下文切换。我想不出一种方法来规避这个问题,但是我想知道通过系统调用获得线程id是否与获得系统时间大致相同。

最后,我使用了gcc实现的线程本地存储,详细信息请参见此。

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

最新更新