http://blog.csdn.net/raomeng1/article/details/7685421

一、使用互斥锁和条件变量实现读写锁:

class readwrite_lock
{
public:readwrite_lock(): stat(0){}void readLock(){mtx.lock();while (stat < 0)cond.wait(mtx);++stat;mtx.unlock();}void readUnlock(){mtx.lock();if (--stat == 0)cond.notify_one(); // 叫醒一个等待的写操作mtx.unlock();}void writeLock(){mtx.lock();while (stat != 0)cond.wait(mtx);stat = -1;mtx.unlock();}void writeUnlock(){mtx.lock();stat = 0;cond.notify_all(); // 叫醒所有等待的读和写操作mtx.unlock();}private:mutex mtx;condition_variable cond;int stat; // == 0 无锁;> 0 已加读锁个数;< 0 已加写锁
};

二、使用2个互斥锁实现读写锁:

class readwrite_lock
{
public:readwrite_lock(): read_cnt(0){}void readLock(){read_mtx.lock();if (++read_cnt == 1)write_mtx.lock();read_mtx.unlock();}void readUnlock(){read_mtx.lock();if (--read_cnt == 0)write_mtx.unlock();read_mtx.unlock();}void writeLock(){write_mtx.lock();}void writeUnlock(){write_mtx.unlock();}private:mutex read_mtx;mutex write_mtx;int read_cnt; // 已加读锁个数
};

用mutex和conditon实现写优先的读写锁


class RWLock {
private:pthread_mutex_t mxt;pthread_cond_t cond;int rd_cnt;//等待读的数量int wr_cnt;//等待写的数量public:RWLock() :rd_cnt(0), wr_cnt(0) {pthread_mutex_init(&mxt,NULL);pthread_cond_init(&cond,NULL);}void readLock() {pthread_mutex_lock(&mxt);++rd_cnt;while(wr_cnt > 0)pthread_mutex_wait(&cond, &mxt);pthread_mutex_unlock(&mxt);}void readUnlock() {pthread_mutex_lock(&mxt);--rd_cnt;if (rd_cnt == 0 )pthread_cond_signal(&cond);pthread_mutex_unlock(&mxt);}void writeLock() {pthread_mutex_lock(&mxt);++wr_cnt;while (wr_cnt + rd_cnt >=2)pthread_cond_wait(&cond, &mxt);pthread_mutex_unlock(&mxt);}void writerUnlock() {pthread_mutex_lock(&mxt);--wr_cnt;if(wr_cnt==0)pthread_cond_signal(&cond);pthread_mutex_unlock(&mxt);}
};

c++实现读写共享锁相关推荐

  1. Oracle之事务和锁

    那我们现在讲事务的东西,无论我们是什么数据库,只要是关系型数据库,都有ACID,那ACID原子性,一致性,隔离性,持久性分别的场合在这里说1. 首先原子性,一个事务必须是一个完整的操作,事务的各个部分 ...

  2. 面试官:Zookeeper怎么解决读写、双写并发不一致问题,以及共享锁的实现原理?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  3. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  4. java 对变量加锁_Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁...

    乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...

  5. MySQL - 共享锁和排它锁初探

    文章目录 生猛干货 官方文档 事务隔离级别 共享锁 VS 排他锁的区别 SELECT ... FOR UPDATE 排它锁 演示 SELECT ... LOCK IN SHARE MODE 共享锁 演 ...

  6. Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”

    在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 线程锁 乐观锁 VS 悲 ...

  7. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  8. MySQL调优(八):查缺补漏(mysql的锁机制,读写分离,执行计划详解,主从复制原理)

    mysql的锁机制 1.MySQL锁的基本介绍 ​ 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共 ...

  9. 事务管理基础:排它锁和共享锁相关知识笔记

    1.排它锁.共享锁出现的意义 数据库的并发事务对数据库进行读写,可能会破坏事务的隔离性和数据一致性.为了保持事务的隔离性,系统必须对事务之间的相互作用加以控制.最典型的做法就是当一个事务访问某个数据对 ...

最新文章

  1. 2022-2028年中国橡胶漆产业发展动态及未来趋势预测报告
  2. 甘肃省计算机二级考试题库,2011甘肃省计算机等级考试二级最新考试试题库(完整版)...
  3. 【英文文本分类实战】之二——数据集挑选与划分
  4. CryptoAPI与openssl数字签名与验证交互
  5. 超级菜鸟如何入门数据分析?
  6. JAVA 通过url下载图片保存到本地(亲测)
  7. @async 默认线程池_springboot@Async默认线程池导致OOM问题
  8. 性能优化之图片懒加载
  9. SpringCloud Zuul(三)之常见用法
  10. Java代理系列-静态代理
  11. 细菌基因组基本概念(一)
  12. java调用javafx_Java代码调用JavaFX的例子(大力推荐)
  13. 不同业务场景下如何进行数据库水平切分?
  14. AMESim找图形平衡点的方法
  15. bootstrap在线定制工具
  16. 三种工厂模式详解-简单工厂模式、工厂模式、抽象工厂模式
  17. 惠普服务器关机自动重启,惠普电脑关机后自动重启怎么解决
  18. spss modeler模型应用
  19. 解决 input 输入框在中文输入法下的 bug
  20. 关于学的计算机句子,赞美计算机唯美句子41条

热门文章

  1. 预训练语言模型论文分类整理:综述、基准数据集、PLM的设计和分析
  2. PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能
  3. web第一节2020.5.11
  4. poj 3264 Balanced Lineup RMQ问题 线段树
  5. JavaScript基础学习之强制类转换(二)
  6. iar遇到pcode returned with_表面情场高手,遇到真爱会秒怂的三大星座,射手座上榜...
  7. Typora——恢复未保存文件解决方案
  8. PyCharm——turtle库的画布悬停解决方案
  9. Codeforces 1196B Odd Sum Segments
  10. CG CTF WEB pass check