Linux C++ 获取线程标识
2023-02-22 本文已影响0人
kuxingseng686
在 Linux C++ 网络编程中,经常会使用到线程的标识,下面整理了常用的获取线程标识的方法:
1、gettid
获取内核线程的 ID, 当只有一个线程时得到的是进程的 pid,和使用 getpid 获取的结果相同。
#include <sys/types.h>
pid_t gettid(void);
此方法在 glibc 中并没有封装,需要使用 syscall 系统调用封装
#include <sys/types.h>
#define gettid() syscall(_NR_gettid)
2、pthread_self
获取的是线程 ID ,线程ID在某个进程中是唯一的,在不同进程中创建的线程可能 ID 相同, 所以此方法获取的 ID 也不是全局唯一的;
#include <pthread.h>
pthread_t pthread_self(void);
3、syscall
在内核中每个线程都有自己的 pid,要想得到线程的 pid,必须用系统调用,通过此方法获取的标识是唯一的;
在 muduo 中 ,为了减少系统调用开销,会将系统调用获取的线程 ID 缓存起来( t_cachedTid 是线程局部存储 __thread):
//获取线程id
pid_t gettid()
{
return static_cast<pid_t>(::syscall(SYS_gettid));
}
//将线程id缓存起来
//t_cachedTid是线程局部存储 __thread
void CurrentThread::cacheTid()
{
if (t_cachedTid == 0)
{
t_cachedTid = detail::gettid();
int n = snprintf(t_tidString, sizeof t_tidString, "%5d ", t_cachedTid);
assert(n == 6); (void) n;
}
}
4、c++11
c++11中获取线程id的方法
#include <thread>
std::this_thread::get_id();