TLS:Thread Local Storage 线程本地存储
本质:对于一些全局变量,为每一个线程分配一个实例,各线程只使用自己的实例,而不用去争抢那一个全局变量的实例
TLS的真实一亿在于不用为每个线程去定义一个全局匾蛉,而使用特殊关键字或者API自动为每个线程实例分配私有的全局变量,
这对一些特殊算法非常有意义,尤其是在预先不知道到底又多少线程要运行的情况下
关键字法:
__declspec(thread) int tls_i=1;
动态API的方法:
1、使用TlsAlloc函数为每个全局变量分配一个TLS索引(该索引在整个进程中唯一,对于所有线程来说同一个索引代表相同含义
的全局变量);
注:相当于为每个线程使用_beginthreadex为线程分配了一个_tiddata内存块,同时结束的时候和_endthreadex相搭配
DWORD dwTlsIndex=TlsAlloc();
2、使用TlsSetValue将该线程的值放入到对应索引的全局变量,替代直接存值在全局变量的操作
TlsSetValue(dwTlsIndex,pAnyData);
3、使用TlsGetValue从指定索引处取出该线程之前存入的值
pAnyData=TlsGetValue(dwTlsIndex)
4、使用TlsFree释放TLS的索引
TlsFree(dwTlsIndex)
关键字法以来于VC++编译器,而API方法则可以在任何可以调用API的语言环境中可用
相对来说关键字法更易于理解和使用适合改造一些以来全局变量的非多线程安全的库。