TLS(Thread Local Storage)线程本地存储

        最近开始看些多线程设计。总体觉得,如果只是单单想达到多线程安全的目的,通过加锁很容易实现。多线程的难点在于,如何实现最大的并行度,即如何确定加锁区段,使尽可能多的线程可以工作,而不是简单的给一个大函数整个加锁。

        其中提到过TLS,线程本地存储。windows的实现关联到4个函数:

(1)TlsAlloc

          返回一个index,标示一个存储空间。一个存储空间包含64个存储单元。即一个index,可以对应64个线程使用自己的副本。

(2)TlsSetValue 

         通过index,可以设置和本线程相关的存储单元。

(3)TlsGetValue

         通过index,可以得到和本线程相关的存储单元 。

(4)TlsFree  

        通过index,释放一个存储空间。


具体的用法:

1,在main函数中通过 TlsAlloc 来分配一个存储空间,返回值index,把index会存储在一个全局变量中,供各个线程使用。


2,在线程函数里面,通过TlsSetValue( index, value ),把value设置到存储空间,对应的存储单元里面。对不同的线程,大家用的是同一个存储空间,这个存储空间通过index来显示的指示,但是存在哪个存储单元中,由各个线程自己隐式标示。

          线程1自己说,存储到 index里面,

         线程2自己说,存储到 index里面,

         线程3自己说,存储到 index里面,

内部而已,每个线程占用同一个存储空间,但是会占用不同的存储单元。


3,在线程函数内,通过TlsGetValue(index)得到线程自己的value。

        线程1自己说,获取index里面的值,

         线程2自己说,获取index里面的值,

         线程3自己说,获取index里面的值,

各个线程会得到自己对应的存储单元。


4,在main函数中通过TlsFree  释放存储空间。


你可能感兴趣的:(系统学习)