目录
1、概述
2、CurrentThread.h
3、 CurrentThread.cc
1、概述
我们的服务器程序不一定就只有1个Eventloop,我们可能有很多的Eventloop,每个Eventloop都有很多channel,自己channel上的事件要在自己的Eventloop线程上去处理,Eventloop在这里涉及到获取当前线程的ID
下面获取的是961这个进程中的线程,第一列是线程ID
2、CurrentThread.h
我们看到使用了全局变量, 所有线程共享的,加了__thread,或者是C++11的thread_local来定义的话,就是:虽然是全局变量,但是会在每一个线程存储一份拷贝,这个线程对这个变量的更改,别的线程是看不到的。每一个线程都有自己的t_cachedTid。
void cacheTid():因为tid的访问是系统调用,总是从用户空间切换到系统空间的话,会比较浪费效率,所以第一次访问,就把当前线程的Tid存储起来,后边如果再访问就从缓存取。
#pragma once
#include <unistd.h>
#include <sys/syscall.h>
namespace CurrentThread
{
extern __thread int t_cachedTid;
void cacheTid();
inline int tid()//内联函数,只在当前文件起作用
{
if(__builtin_expect(t_cachedTid==0,0))//缓存中没有这个tid
{
cacheTid();
}
return t_cachedTid;
}
}
3、 CurrentThread.cc
#include "CurrentThread.h"
namespace CurrentThread
{
__thread int t_cachedTid=0;
void cacheTid()
{
if(t_cachedTid==0)
{
//通过Linux系统调用,获取当前线程的tid值
t_cachedTid=static_cast<pid_t>(::syscall(SYS_gettid));
}
}
}