一、获取当前线程ID的方法
#include <unistd.h>
#include <sys/syscall.h>
#define gettid() syscall(__NR_gettid)
pid_t tid=gettid(); //current thread id
pid_t pid=getpid(); //current process id
系统调用次数会影响程序的性能。如果有多个类需要查看当前线程ID,首先想到的方法就是定义个全局变量,但是在多线程中就会导致频繁调用系统函数降低性能,而且定义全局变量总是一个坏想法。
考虑到这些问题,关键字__thread可以很好地帮助我们解决问题。
二、善用__thread关键字
__thread是GCC内置的线程局部存储设施(thread local storage)。它的实现非常高效。__thread变量是每个线程有一份独立实体,各个线程的变量值互不干扰。除了这个主要用途,它还可以修饰那些“值可能会变,带有全局性,但是又不值得用全局锁保护”的变量。
需要注意的是它的使用规则:只能用于修饰POD类型(Plain old data structure),不能修饰class类型,因为无法自动调用构造函数和析构函数。__thread可以用于修饰全局变量、函数内的静态变量,但是不能用于修饰函数的局部变量或者class的普通成员变量。另外,__thread变量的初始化只能用编译期常量。
#include <sys/syscall.h>
//#define gettid() syscall(__NR_gettid)
pid_t gettid()
{
return static_cast<pid_t>(syscall(SYS_gettid));
}
__thread pid_t t_cachedTid = 0;
pid_t CurrentThreadtid()
{
if (t_cachedTid == 0)
{
t_cachedTid = gettid();
}
return t_cachedTid;
}
此后各个线程只需调用底层函数CurrentThreadtid()就可以获得当前线程的ID,且只在最初使用时调用一次系统调用,此后都直接获取t_cacheTid所存储的值。
参考资料:
Linux多线程服务端编程 使用muduo C++网络库