本文首发于我的公众号:码农手札,主要介绍linux下c++开发的知识包括网络编程的知识同时也会介绍一些有趣的算法题,欢迎大家关注,利用碎片时间学习一些编程知识,冰冻三尺非一日之寒,让我们一起加油!
前言
学习操作系统的过程中又接触到了读写锁,这个东西很早就听说过,但是一直也没具体了解如何实现一个读写锁,今天既然正好看到了,不妨就试试来实现一下,通过锁和条件变量来实现读写锁以及写者优先的读写锁
读写锁
1 |
|
上面的代码使用来一些c++11中的特性,使得代码十分简单,也不难理解
写者优先的读写锁
1 |
|
这个代码其实也很简单,只是在读者被唤醒的时候判断了写者的数量是否为0,如果是0的话才会被唤醒,如果不是0的话,意味着有写者正在等待,那么这个读者就会继续睡眠,直到写者的数量为0,这样我们就实现了一个写者优先的读写锁。
再提供一个对于读写锁的封装,实现RAII
读写锁封装
1 | template <typename _RWLockable> class unique_writeguard { |
这样我们就完成了一个完整的读写锁,实现起来并不是很麻烦,只是需要一些简单c++11特性以及小技巧,比如使用两个条件变量cond_w和cond_r将读写线程等待的信号分开,这样在读多写少的条件下就会很方便的唤醒写线程,减少唤醒线程的数量也就减小了线程的切换,减小了开销。
参考博客:
c++中写者优先的读写锁实现