c++ 获取线程标识的 4 中方法

10 篇文章 0 订阅

在 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值