下面请看这段代码:
#include <iostream>
#include <sstream>
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#include <sys/syscall.h>
#endif
//并返回相应的线程ID window Linux
size_t getThreadId() {
#ifdef WIN32
size_t threadId = static_cast<size_t>(GetCurrentThreadId());
#else
static thread_local const size_t threadId = static_cast<size_t>(syscall(SYS_gettid));
#endif
return threadId;
}
其中这段代码是我在项目中优化日志管理添加的,为日志添加获取当前的线程ID号,为了后期项目排错,可以及时定位问题。
window下直接调用GetCurrentThreadId(),GetCurrentThreadId函数不接受任何参数,并直接返回调用它的线程的TID。返回参数:无符号长整型(DWORD),用于标识当前线程。直接由操作系统提供的,因此它的执行效率很高。
Linux下调用syscall()函数,使用方法如上面代码所示。在这里我遇到的问题:pthread_self一开始我使用的是这个方法,但是打印出来的值很大,至于这个有啥问题,或者说正确与否,我没研究了。后面使用了这个syscall方法,打印出来的值明显比pthread_self方法要小,有没有大佬评论区解释一下?
syscall也是系统调用方法,这就会出现一个问题,在多并发的情况下需不需要上锁?结果是不需要的,因为:对于大多数操作系统提供的、用于基本系统查询或管理的API(如获取线程ID、进程ID、系统时间等),它们通常都被设计为线程安全的,因此在多线程环境中调用这些API时不需要加锁。(上网查的资料)。
static thread_local const size_t threadId的声明方式在多线程编程中提供了一种高效、安全且易于管理的方式来获取和存储每个线程的ID。
其中:thread_local 关键字确保每个线程都有 threadId变量的一个独立副本。这意味着每个线程都可以安全地读取和写入自己的 threadId 变量,而不会影响到其他线程。这对于获取和管理每个线程的唯一标识符(线程ID)特别有用。