RWLock C++ implementation

本文最后更新于:2022年11月22日 下午

其实 boost 库已经有相关的实现,在实际工程中使用 boost 库的实现可能会使得我们程序更加健壮。

这边展示的是一个比较 naive 的实现,逻辑上也并不复杂。

成员变量readerCount记录正在临界区的读者数量,mutexReader以及mutexWriter实现相应的控制逻辑

WLockWUnlock比较简单,就是直接对mutexWriter进行加锁和放锁

而在RLock中,首先会去获取读锁mutexReader,这是因为需要保护对变量readerCount的访问,如果是第一个读者,还需要获取写锁,防止有写者进入临界区。

RUnlock中,逻辑相似,最后一个离开临界区的读者需要负责把写锁释放掉。

从整体实现上看这是一个偏向读者的读写锁,因为它允许读者在有写者等待时进入临界区,这样的话如果有读者不断到来,可能会引起写者饥饿。

全部代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using namespace std;
class RWLOCK{
private:
size_t readerCount;
mutex mutexReader, mutexWriter;
public:
RWLOCK():readerCount(0){

}

void RLock(){
unique_lock<mutex> ul(mutexReader);
readerCount++;
if(readerCount == 1){
mutexWriter.lock();
}
}

void RUnlock(){
unique_lock<mutex> ul(mutexReader);
readerCount--;
if(readerCount == 0){
mutexWriter.unlock();
}
}

void WLock(){
mutexWriter.lock();
}

void WUnlock(){
mutexWriter.unlock();
}
};

RWLock C++ implementation
https://flaglord.com/2021/09/30/RWLock-C-implementation/
作者
flaglord
发布于
2021年9月30日
许可协议