最近开始看些多线程设计。总体觉得,如果只是单单想达到多线程安全的目的,通过加锁很容易实现。多线程的难点在于,如何实现最大的并行度,即如何确定加锁区段,使尽可能多的线程可以工作,而不是简单的给一个大函数整个加锁。
其中提到过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来显示的指示,但是存在哪个存储单元中,由各个线程自己隐式