vs2010对于读写锁技术的分离,很实用的c+新特性

读写锁技术的分离 c++

原著博客这么长长的看着眼痛,其实很明白的一件事情,原来锁的问题是一个人在读,另外的人都不读,叫CriticalSection,后来来了一种锁,可以只再写的时候,把变量锁上,读的时候,跟其他线程之间的读者之间是不锁的,只对想写的人是锁住的。vs2010后的东西,好东西但是知道的人不多


Slim读/写锁

SRWLock的目的和关键段相同,对一个资源进行保护,构造了一段“原子访问”的代码,不让其他线程访问它。但与关键段不同的是SRWLock允许区分想要读取资源值的线程和想要写入资源值的线程,因为仅仅读取资源是不会破坏数据的,下面是Slim读/写锁的简单用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SRWLOCK g_srwLock
...
//init SRWLock
InitializeSRWLock(&g_srwLock);
...
//当需要写入资源的时候申请"排他锁"
AcquireSRWLOckExclusive(&g_srwLock);
//执行写入动作
...
//写入结束后释放"排他锁"
ReleaseSRWLockExclusive(&g_srwLock);
//-----------------------------------------
//当需要读取时申请"共享锁"
AcquireSRWLockShared(&g_srwLock);
//执行读操作
...
//读取结束后释放"共享锁"
ReleaseSRWLockShared(&g_srwLock);
  
  
//系统会自动清理g_srwLock,没有别的清理函数

可以看到,存在两种锁用于此机制:"排他锁"和"共享锁"。排他锁需要任何中锁都不存的情况下才能返回,否则阻塞;共享锁在没有排他锁的情况下就可以返回,哪怕有其他共享锁也没关系。这样在写操作之前申请排他锁,在读之前申请共享锁就可以保证共享资源数据不会被意外破坏。另外,只有初始化函数而没有释放函数。

看似SRWLock更关键段十分相似,但相比关键段SRWLock缺乏下面两个特性:

1、不存在对应的TryEnterXXX函数,如果锁已被占用那么只能选择阻塞调用线程;

2、不能递归的获得SRWLock。也就是说一个线程不能为了多次写入资源而多次锁定资源。而关键段可以做到。回想一下,因为关键段在Enter的时候将判断当前线程是否是共享资源的占有者,如果是则会“放行”,并增加引用计数。然而SRWLock始终不关心调用线程是谁。


你可能感兴趣的:(c+,读写分离锁,共享锁)