`
bulote
  • 浏览: 1307528 次
文章分类
社区版块
存档分类
最新评论

读写锁算法

 
阅读更多

背景:

在多线程编程中经常面临这样一个问题,同一个数据可以被多个线程同时读取,但是同一时间只能有一个线程对共享变量进行写操作。

对该问题常用的解决方法时声明一个锁(互斥量)来对共享变量进行保护,这样每次只能有一个线程来对数据进行读写,会导致读取的效率低下。

读写锁:

读写锁算法主要实现对共享资源访问时,可以在多个线程间同时进行读操作,但是在同一时间内只能有一个线程对共享资源进行修改,并且在写操作时不能有线程进行读操作。


算法思想:

当进行读操作时不能进行写操作,因此当有读操作时需要一把锁来锁住写操作,由于允许多个线程同时读操作,因此还需要一个变量(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实现及思考关于读写锁算法的Java...

    linux下实现高性能读写锁(read/write lock)

    在linux下按照windows的slim read/write lock算法实现的读写锁源码。

    域天YT88普通算法密钥分析读取解密工具

    通过分析YT88加密狗抓取到的USBTRACE中普通算法返回数据(0203或0204的返回数据),直接用本工具就可以解密出普通算法密钥。

    飞天诚信 Rockey1智能锁 加密锁 加密狗 使用手册

    它采用高性能智能卡芯片,高速HID设备,无需安装驱动,融合了加密锁和智能卡技术,提供约8K的存储空间,内置RSA、3DES、 DES等高强度数据加密算法。通过灵活的远程升级和计次管理功能,开发商可以方便的实现产品的...

    飞天诚信Rockey3写锁工具

    ROCKEY3 是飞天诚信的一款采用智能卡芯片、无需安装... 用户可以用KEIL C51编写自己的专用算法可执行文件,实现自己特有的高强度加密方案。 附件是官方提供的Rockey3写狗工具,附有详细说明书,有需要的可以下载学习。

    论文研究-Co-Work:基于HDFS的安全云存储数据一致性保持算法.pdf

    Organization Model)基础上,对MDSS端元数据的管理操作、MDSS和DMS之间的通信过程做进一步优化,针对ASOM模型实际场景引入锁思想实现两个节点一致性的Co-Work算法,完成MDSS和DMS节点之间的协同工作和数据的一致性...

    Concurrent Control with “Readers” and “Writers”

    1971年在“Operating Systems”上发表的论文,讨论读写锁的实现算法

    lamport-distributed-lock:Lamport分布式锁的基本实现,用于学习

    Lamport的分布式锁 Lamport在提出的分布式互斥锁的基本实现 设置 安装ZeroMQ: ://zeromq.org/download/ 运行: make 运行测试 ./runtest.sh

    一种适用于RFID读写器的加密算法及其实现

    随着电子信息技术的发展,非接触式智能卡(如RFID卡)已经在我们的生活中随处可见。与传统的接触式卡、磁卡相比,利用射频...在软件系统实现方面,提出了一系列安全协议,如:Hash锁、随机Hash锁、Hash链以及改进的随机

    RFID技术中的一种适用于RFID读写器的加密算法及其实现

    随着电子信息技术的发展,非接触式智能卡(如RFID卡)已经在我们的生活中随处可见。与传统的接触式卡、磁卡相比,利用射频...在软件系统实现方面,提出了一系列安全协议,如:Hash锁、随机Hash锁、Hash链以及改进的随机

    尚硅谷Java视频_JUC 视频教程

    尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. 尚硅谷_JUC线程高级_线程调度 ·15. ForkJoinPool 分支合并框架-工作窃取

    多核计算与程序设计(2009年3月1日出版)第一二三部分

    第1部分介绍多核编程的基础知识,包括多核编程常见问题、锁竞争、加速比、负载均衡等基本概念,多线程退出算法、读写锁、旋转锁、原子操作等多线程编程基础知识,基于OpenMP标准的并行程序设计基础等; 第2部分介绍...

    嵌入式系统/ARM技术中的嵌入式指纹锁的设计与实现

    指纹识别门锁系统的硬件结构 指纹识别门锁系统的硬件结构主要包括:指纹识别模块、微控制器、读写模块、电源管理和电控锁机构以及门锁功能所需的红外感应电路和液晶LCD显示等,其中核心部分是指纹识别模块和微控制...

    FreeBSD操作系统设计与实现

    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实现...

    java8集合源码分析-pangdan:面试相关技能

    数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式) 隔离级别,依次解决的问题(脏读、不可重复读、幻读) 事务的ACID B树、B+树 优化(explain,慢查询,show ...

    gostore:存储算法

    所有存储算法都有一些子包: 读写互斥锁跨进程。 辅助函数的集合。 实现日志结构合并。 自定义内存分配器,可以代替golang的内存分配器或OS分配器使用。如何贡献 选择一个问题,或创建一个新的问题。 提供有关该...

    最新mysql面试题整理大厂必备,你能答对几个?

    22.InnoDB 存储引擎有几种锁算法? 23.InnoDB 如何实现行锁? 24.MySQL 性能指标都有哪些?如何得到这些指标? 25.MySQL 中的重要日志分为哪几个? 26.redo log 和 binlog 有什么区别? 27.慢查询日志的获取方式有...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    读写分离 性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算 数据预读 异步 轮询与通知 内存池 模块化 工程架构能力 开发语言 运维与...

    golang面试题集合.zip

    高并发下的锁与map读写问题 定时与 panic 恢复 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能. 七道语法找错题目 golang 并发题目测试 记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行...

    Golang 面试题汇编

    高并发下的锁与map读写问题 定时与 panic 恢复 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能. 七道语法找错题目 golang 并发题目测试 记一道字节跳动的算法面试题 多协程查询切片问题 对已经关闭的的chan进行...

Global site tag (gtag.js) - Google Analytics