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

在 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();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容