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

读写锁算法

 
阅读更多

背景:

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

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

读写锁:

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


算法思想:

当进行读操作时不能进行写操作,因此当有读操作时需要一把锁来锁住写操作,由于允许多个线程同时读操作,因此还需要一个变量(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实现及思考,是一个深入探讨了多线程环境下资源访问控制机制的主题。在现代软件开发中,尤其是并发编程领域,读写锁(ReadWriteLock)是一种非常重要的同步工具,它允许多个线程同时进行读操作...

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

    在Linux系统中,读写锁(Read/Write Locks,简称rwlocks)是一种多线程同步机制,它允许多个线程同时进行读操作,但只允许一个线程执行写操作。这种锁的设计目的是提高并发性能,特别是当读操作远多于写操作时。在...

    Concurrent Control with “Readers” and “Writers”

    他们的研究为读写锁算法提供了理论基础和先驱性算法,如P操作和V操作。 从技术角度分析,读写锁算法的实现需要解决几个关键问题: - 确保读者和作者之间的互斥访问。 - 允许多个读者同时访问,以提高资源的使用...

    各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等

    本文将深入探讨标题和描述中提及的各种锁,包括乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁以及行级锁。 1. **乐观锁**:乐观锁假设多线程环境中的冲突较少,所以在读取数据时不加锁,只有...

    Cache DB Overview

    ** Cache DB 采用高效的读写锁算法,支持多线程并行访问,充分利用多核处理器资源,提高并发性能。 5) **分布式特性。** 支持分布式部署,可以扩展到多台服务器,形成集群,提供更高的可用性和容错性。 6) **高...

    智能锁写锁工具全国

    写锁工具通常涉及到对智能锁内部存储器的编程或修改,例如设置用户权限、更新安全算法或修复系统错误。 "支持智能版本"可能意味着该软件兼容各种智能锁的最新版本,无论它们是由哪个制造商生产的。这通常需要软件...

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

    《域天YT88普通算法密钥分析读取解密工具详解》 在信息安全与软件保护领域,密钥管理与解密技术一直是重要的研究方向。本文将深入探讨“域天YT88普通算法密钥分析读取解密工具”,这款工具主要用于处理YT88加密狗中...

    并行计算——结构·算法·编程习题答案

    并发控制机制,如互斥锁、读写锁、条件变量等,用于保证数据的一致性,防止竞争条件和数据损坏。学习者应理解这些机制的工作原理及其在不同场景下的适用性。 7. **并行编程挑战**: 并行计算并非总是带来性能提升...

    从0开始开发 基础库(配置文件读写、日志、多线程、多进程、锁、对象引用计数、内存池、免锁消息队列、免锁数据缓冲区、进.zip

    互斥锁确保同一时间只有一个线程/进程可以访问资源,而读写锁允许多个读取者同时访问,但写入者独占资源。正确使用锁是避免竞态条件和死锁的关键。 对象引用计数是内存管理的一种策略,主要应用于Python等垃圾回收...

    一把好用的锁一把好用的锁

    2. **读写锁(Read-Write Lock)**:读写锁分为读锁和写锁。多个读取线程可以同时持有读锁,但写锁是独占的。这种设计提高了并发性能,因为多个线程读取数据通常不会引起数据不一致。在C++中,`std::shared_mutex`...

    算法与数据结构 分布式算法课程 第13章 实用互斥算法.具有读-修改-写操作的算法 共72页.pdf

    通过理解并掌握Test-and-Set锁、队列锁和票号锁等算法的工作原理及其实现细节,开发者可以更高效地设计和实现分布式系统,从而提高系统的整体性能和可靠性。此外,在多处理器环境下还需要考虑到缓存一致性、原子操作...

    读写者问题读者优先

    4. **Peterson算法**或**Dijkstra的信号量**:这些经典的同步算法可以经过适当调整用于解决读写者问题。 实际的代码实现可能会根据编程语言和具体需求有所不同,但核心思路都是确保在写者操作期间,没有其他读者或...

    多任务下的数据结构与算法配书光盘.rar

    6. **锁与同步机制**:在多任务环境下,数据一致性是关键问题,利用互斥锁、读写锁、信号量等同步机制可以防止数据不一致,确保多线程访问的安全。 7. **死锁预防与检测**:在并发环境中,死锁是可能导致系统停滞的...

    行业文档-设计装置-锁式接触式IC卡读写器.zip

    4. **安全机制**:读写器应具备防静电、防电磁干扰功能,以及数据加密和解密算法,确保信息安全。 5. **兼容性测试**:读写器需支持多种标准的IC卡格式,如ISO 7816,确保与不同类型的卡片良好配合。 6. **机械...

    C/C++算法笔试题

    - 为了保证并发安全,需要使用锁或者其他同步机制(如读写锁)确保增删改查操作的互斥。同时,合理设计数据结构以减少锁竞争,提高并发性能。 - 对于亿到十亿规模的扩展,可以考虑分布式存储方案,例如将数据分散...

    基于无锁数据结构的FIFO队列算法.pdf

    无锁数据结构的关键在于,它通过原子操作或者特定的算法设计,确保数据结构在并发读写时仍然保持正确性和一致性。这通常需要复杂的算法来确保内存的顺序性,比如使用比较-交换(CAS)操作。 在现代商用多核处理器中...

    (不非法)超级读写TT类.

    5. **数据校验**:在读写过程中,可能集成CRC校验或哈希算法,确保数据完整性。 6. **线程安全**:如果设计为多线程环境使用,那么类内可能包含了锁或者其他同步机制,保证并发访问时的数据一致性。 7. **文件定位**...

    非接触式读写卡芯片简介.pdf

    ### 非接触式读写卡芯片概述 #### 核心概念解析 非接触式读写卡芯片是一种基于射频识别技术(RFID)的工作原理,利用电磁场进行数据交换的电子芯片。这类芯片能够在无需物理接触的情况下实现信息读取与写入,这主要...

    Java中的锁分类与使用.docx

    - **读写锁**(如ReadWriteLock)进一步细分为读锁和写锁,读锁可被多个线程共享,写锁是独占的,提高了读操作的并发性。 4. **可重入锁** - 可重入锁允许同一个线程多次获取同一把锁,例如Java的`synchronized`...

Global site tag (gtag.js) - Google Analytics