1. 用__declspec(thread)创建线程局部变量:__declspec(thread) int tls_count=0;
注意事项:当用__declspec(thread)声明线程局部变量的时候,应注意以下事项:
1>只能用来声明或者定义具有static作用域的变量,而不能用来声明或者定义局部变量,函数,类,类型.其中具有static作用域的变量包括全局对象(包括static和extern),本地静态对象,和C++类的静态数据成员.
2>线程局部变量的声明和定义必须全部指定thread属性
3>不将线程局部变量的地址视为常数
4>如果将DLL的静态作用域数据声明为__declspec(thread) ,则在显式链接时DLL会导致一个保护错误,如果DLL是用LoadLibrary加载的,请在DLL中使用TLS API类分配TLS
2. 使用API创建线程局部变量:
用API创建线程局部变量的典型步骤
1> 主线程调用TlsAlloc为线程局部变量分配索引.
应该把TlsAlloc返回的索引值放到全局变量中,该索引仅对特定线程有意义
2> 为每个线程调用TlsSetValue和TlsGetValue设置和读取线程局部变量
3> 主线程用TlsFree释放线程局部变量存储索引
3. 用CThreadLocal模板类实现线程局部变量
1. 首先从CNoTrackObject派生一个类,该类用来包装线程局部变量
2. 他可以显式加载DLL