背景:
在多线程编程中经常面临这样一个问题,同一个数据可以被多个线程同时读取,但是同一时间只能有一个线程对共享变量进行写操作。
对该问题常用的解决方法时声明一个锁(互斥量)来对共享变量进行保护,这样每次只能有一个线程来对数据进行读写,会导致读取的效率低下。
读写锁:
读写锁算法主要实现对共享资源访问时,可以在多个线程间同时进行读操作,但是在同一时间内只能有一个线程对共享资源进行修改,并且在写操作时不能有线程进行读操作。
算法思想:
当进行读操作时不能进行写操作,因此当有读操作时需要一把锁来锁住写操作,由于允许多个线程同时读操作,因此还需要一个变量(count)来记录当前读操作的线程个数,由于对count的修改需要互斥,因此还需要一个锁用来保存count的修改。
读写锁的数据结构:
typedef struct RWLOCK_st
{
LOCK m_lReadLock;
LOCK m_lWriteLock;
int
m_icount;
} RWLOCK;
读写锁操作伪代码:
1. 声明一个全局的锁 RWLOCK rwLock;
rwLock.m_icount = 0;
//读操作时加锁
RWLock_LockRead()
{
rwLock.m_lReadLock->lock()
rwLock.m_icount++;
if (rwLock.m_icount == 1)
{
rwLock.m_lWriteLock->lock(); //锁住写操作,当有读操作时只锁一次
}
rwLock.m_lReadLock->unlock()
}
RWLock_ReleaseRead()
{
rwLock.m_lReadLock->lock()
rwLock.m_icount--;
if (rwLock.m_icount == 0)
{
rwLock.m_lWriteLock->unlock(); //允许写操作
}
rwLock.m_lReadLock->unlock()
}
RWLock_LockWrite()
{
rwLock.m_lWriteLock->lock() //锁住写操作
}
RWLock_ReleaseWrite()
{
rwLock.m_lWriteLock->unlock()
}
从 RWLock_LockWrite() 和RWLock_ReleaseWrite()中可以看出当进行写操作时如果有读操作会阻塞在RWLock_ReleaseRead()函数rwLock.m_lWriteLock->lock()处,当一个线程完成写操作后,读操作会和写操作线程竞争rwLock.m_lWriteLock->lock()。
读写锁缺点:
优点上面已经说过。
1.进行读操作时会进行再次加锁和解锁操作,计算开销比较大,因此对锁内计算比较小的操作不适合使用读写锁。
2. 如果读操作比较密集,使得rwLock.m_icount永远不可能为0,因此会使写操作线程饿死。
参考:《多核计算与程序设计》,周伟明
分享到:
相关推荐
关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java...
在linux下按照windows的slim read/write lock算法实现的读写锁源码。
通过分析YT88加密狗抓取到的USBTRACE中普通算法返回数据(0203或0204的返回数据),直接用本工具就可以解密出普通算法密钥。
它采用高性能智能卡芯片,高速HID设备,无需安装驱动,融合了加密锁和智能卡技术,提供约8K的存储空间,内置RSA、3DES、 DES等高强度数据加密算法。通过灵活的远程升级和计次管理功能,开发商可以方便的实现产品的...
ROCKEY3 是飞天诚信的一款采用智能卡芯片、无需安装... 用户可以用KEIL C51编写自己的专用算法可执行文件,实现自己特有的高强度加密方案。 附件是官方提供的Rockey3写狗工具,附有详细说明书,有需要的可以下载学习。
Organization Model)基础上,对MDSS端元数据的管理操作、MDSS和DMS之间的通信过程做进一步优化,针对ASOM模型实际场景引入锁思想实现两个节点一致性的Co-Work算法,完成MDSS和DMS节点之间的协同工作和数据的一致性...
1971年在“Operating Systems”上发表的论文,讨论读写锁的实现算法
Lamport的分布式锁 Lamport在提出的分布式互斥锁的基本实现 设置 安装ZeroMQ: ://zeromq.org/download/ 运行: make 运行测试 ./runtest.sh
随着电子信息技术的发展,非接触式智能卡(如RFID卡)已经在我们的生活中随处可见。与传统的接触式卡、磁卡相比,利用射频...在软件系统实现方面,提出了一系列安全协议,如:Hash锁、随机Hash锁、Hash链以及改进的随机
随着电子信息技术的发展,非接触式智能卡(如RFID卡)已经在我们的生活中随处可见。与传统的接触式卡、磁卡相比,利用射频...在软件系统实现方面,提出了一系列安全协议,如:Hash锁、随机Hash锁、Hash链以及改进的随机
尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. 尚硅谷_JUC线程高级_线程调度 ·15. ForkJoinPool 分支合并框架-工作窃取
第1部分介绍多核编程的基础知识,包括多核编程常见问题、锁竞争、加速比、负载均衡等基本概念,多线程退出算法、读写锁、旋转锁、原子操作等多线程编程基础知识,基于OpenMP标准的并行程序设计基础等; 第2部分介绍...
指纹识别门锁系统的硬件结构 指纹识别门锁系统的硬件结构主要包括:指纹识别模块、微控制器、读写模块、电源管理和电控锁机构以及门锁功能所需的红外感应电路和液晶LCD显示等,其中核心部分是指纹识别模块和微控制...
8.9.4 读写文件 8.9.5 布局策略 8.9.6 分配机制 8.9.7 将块组成簇 8.9.8 基于扩展的分配 8.10 复习题 8.11 参考文献 第9章 网络文件系统 9.1 历史和概述 9.2 NFS的结构和操作 9.2.1 NFS协议 9.2.2 FreeBSD的NFS实现...
数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式) 隔离级别,依次解决的问题(脏读、不可重复读、幻读) 事务的ACID B树、B+树 优化(explain,慢查询,show ...
所有存储算法都有一些子包: 读写互斥锁跨进程。 辅助函数的集合。 实现日志结构合并。 自定义内存分配器,可以代替golang的内存分配器或OS分配器使用。如何贡献 选择一个问题,或创建一个新的问题。 提供有关该...
22.InnoDB 存储引擎有几种锁算法? 23.InnoDB 如何实现行锁? 24.MySQL 性能指标都有哪些?如何得到这些指标? 25.MySQL 中的重要日志分为哪几个? 26.redo log 和 binlog 有什么区别? 27.慢查询日志的获取方式有...
读写分离 性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算 数据预读 异步 轮询与通知 内存池 模块化 工程架构能力 开发语言 运维与...
高并发下的锁与map读写问题 定时与 panic 恢复 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能. 七道语法找错题目 golang 并发题目测试 记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行...
高并发下的锁与map读写问题 定时与 panic 恢复 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能. 七道语法找错题目 golang 并发题目测试 记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行...