获取线程ID:利用关键字__thread减少系统调用使用次数

 一、获取当前线程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++网络库

猜你喜欢

转载自blog.csdn.net/u014694510/article/details/83624045