线程通信机制之轻量级读写锁

线程通信机制之轻量级读写锁

——每周杂谈 第006篇

作者:Tocy    时间:2012-05-29

关键词:读写锁,线程同步,ITC

Slim Reader/Writer (SRW) Locks(轻量级读写锁,笔者译)跟critical section类似,用于控制同一个进程内部不同线程之间共享资源的访问,设计的最初目的是高效性,并且占用很少内存。读线程从共享资源中读数据,同时写线程需要向共享资源中写数据,当多个读、写线程共用一个资源(缓冲区)的时候,据需要使用诸如critical section或者互斥量的排他性锁(独占锁)来控制资源的访问,但是针对读操作较为频繁,写操作相对较少的情况下,使用独占锁是很不划算的,需要耗费更多的时间和其他资源。这种情况下使用轻量级读写锁是非常合适的。SRW锁提供两种访问共享资源的方式:

(1)共享模型:多个读线程共享资源的只读访问权,这样就可以让读线程可以并发地读取共享资源中的数据。通常情况下,如果读操作超过写操作,相对于使用critical section,SRW锁提供的并发性对系统性能和吞吐率有很大提升。

(2)排他模式(独占模式):写线程独立获得共享资源的读/写权限。如果某个线程获得了独占锁,其他线程是不能访问共享资源的,直到该线程释放独占锁。

SRW锁可以使用上面两种模式中任意一种模式获得,通常读线程使用共享模式获得SRW锁,写线程通常使用独占模式获得SRW锁。Windows操作系统下对于请求线程获得SRW锁的顺序是不确定的,SRW锁的获得概率不是平均的,也不是按照先到先得(FIFO)的方式。

SRW锁在具体实现上的较为简单,Windows下是一个指针的长度,这样能够快速更新锁的状态。带来的问题是附带的状态信息非常少,也使得SRW锁不能递归的获得,即SRW锁在获得之后,不能再调用捕获同一个锁的函数,同时对于获得共享模式下的SRW锁的线程不能动态的将权限提升到独占锁,要实现这种操作必须先释放共享锁,然后重新等待获得独占锁。

表格 1 SRW锁相关函数及其说明

SRW lock function

Description

AcquireSRWLockExclusive

以独占模式获得 SRW lock

AcquireSRWLockShared

以共享模式获得SRW lock

InitializeSRWLock

初始化 SRW lock.

ReleaseSRWLockExclusive

释放独占模式下打开的SRW lock

ReleaseSRWLockShared

释放共享模式下打开的SRW lock

SleepConditionVariableSRW

以原子操作执行两个操作:等待条件变量成立并已获得的释放SRW锁.

TryAcquireSRWLockExclusive

以独占模式尝试获得SRW lock。如果函数调用成功,调用线程获得该锁。

TryAcquireSRWLockShared

以共享模式尝试获得SRW lock。函数调用成功的话,调用线程获得该锁。

 

轻量级读写锁使用时首先要初始化SRW锁,然后成对的使用acquire和release函数来控制临界资源的访问。(需要说明的是最后两个函数是Win 7上新提供的函数,所以不要在低版本的操作系统上使用这两个函数)。可使用tryacquireXXX函数来提前测试线程时候可以获得SRW锁,如果不可以,继续执行其他操作既可以。提高系统的运行效率和CPU利用率。

 

注:版权所有,请勿用于商业用途,转载请注明原文地址。本人保留所有权利。

posted @ 2012-06-03 10:10  Tocy  阅读(759)  评论(0编辑  收藏  举报