看muduo源码,发现有很多使用__thread的地方,所以先单独写一下__thread的功能。
这个特性是linux的非标准特性,需要内核(Linux2.6提供)、Pthreads实现(NPTL提供)以及C编译器(在X86-32平台上由gcc 3.3或后续版本提供)的支持。
线程局部存储的主要优点在于,比线程特有数据的使用要简单。要创建线程局部变量,只要简单地在全局或静态变量的声明中包含__thread说明符即可。
static __thread buf[MAX_ERROR_LEN];
但凡带有这种说明符的变量,每个线程都拥有一份对变量的拷贝。线程局部存储中的变量将一直存在,直至线程终止,届时会自动释放这一存储。
关于线程局部变量的声明和使用,需要注意如下几点。
1、如果变量声明中使用了关键字static或extern,那么关键字__thread必须紧随其后。
2、与一般的全局或静态变量声明一样,线程局部变量在声明时可以设置一个初始值。
3、可以使用C语言取址操作符&来获取现场局部变量的地址。
上面的文字摘抄自《Linux/UNIX系统编程手册》,所以是专门针对C的,对于C++,只能用于修饰POD类型,不能修饰class类型,因为无法自动调用构造函数和析构函数。