0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

读写锁的实现原理规则

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-21 11:21 次阅读

读写锁

互斥锁或自旋锁要么是加锁状态、要么是不加锁状态,而且一次只有一个线程可以对其加锁。

读写锁有3 种状态:读模式下的加锁状态(以下简称读加锁状态)、写模式下的加锁状态(以下简称写加锁状态)和不加锁状态(见),一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁。因此可知,读写锁比互斥锁具有更高的并行性!

图片

读写锁有如下两个规则:

  1. 当读写锁处于写加锁状态时,在这个锁被解锁之前,所有试图对这个锁进行加锁操作(不管是以读模式加锁还是以写模式加锁)的线程都会被阻塞。
  2. 当读写锁处于读加锁状态时,所有试图以读模式对它进行加锁的线程都可以加锁成功;但是任何以写模式对它进行加锁的线程都会被阻塞,直到所有持有读模式锁的线程释放它们的锁为止。

读写锁非常适合于对共享数据读的次数远大于写的次数的情况。

初始化和销毁读写锁

#include < pthread.h >

int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

加锁和解锁

#include < pthread.h >

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209328
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19675
收藏 人收藏

    评论

    相关推荐

    Linux下线程间通讯---读写和条件变量

    读写,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。件变量是线程可用的一种同步机制,条件变量给多个线程提供了一个回合的场所,条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。
    的头像 发表于 08-26 20:44 1469次阅读
    Linux下线程间通讯---<b class='flag-5'>读写</b><b class='flag-5'>锁</b>和条件变量

    Rust 语言中的 RwLock内部实现原理

    Rust是一种系统级编程语言,它带有严格的内存管理、并发和安全性规则,因此很受广大程序员的青睐。RwLock(读写)是 Rust 中常用的线程同步机制之一,本文将详细介绍 Rust 语言
    的头像 发表于 09-20 11:23 865次阅读

    ADA4350如何实现串口读写

      问:ADA4350可写不可读是怎么回事,如何实现串口读写?
    的头像 发表于 10-31 16:35 872次阅读
    ADA4350如何<b class='flag-5'>实现</b>串口<b class='flag-5'>读写</b>

    Linux读写逻辑解析—尝试获取写

    Rwsem的count成员还有一些bit用来标记当前读写状态(waiter bit和handoff bit),也需要根据情况进行调整
    的头像 发表于 12-04 11:12 703次阅读
    Linux<b class='flag-5'>读写</b><b class='flag-5'>锁</b>逻辑解析—尝试获取写<b class='flag-5'>锁</b>

    命名管道FIFO读写规则

    Linux命名管道FIFO的读写规则《Linux程序设计(第3版)》对于Linux命名管道的读写规则详解的不够详细和清楚,查了些资料,在此总结一下: 1.从FIFO中读取数据:约定:如
    发表于 09-24 10:49

    Lock体系结构和读写机制解析

    中,如何实现ABC的顺序打印问题,基本思路就是基于线程的等待通知机制,但是实现方式很多,上述只是其中一种方式。二、读写机制1、基础API简介重入
    发表于 01-05 17:53

    RT-Thread实现的互斥属性包括哪些

    * lock);函数返回 lock无效返回EINVAL,否则返回0或EPERM。互斥属性RT-Thread实现的互斥属性包括互斥类型和互斥
    发表于 08-12 15:06

    基于规则的RADIUS Server设计与实现

             本文在分析RADIUS 协议原理基础上,给出了一种基于规则的RADIUS Server 的设计方案和实现策略,规则的引入可以很方便
    发表于 09-14 08:20 23次下载

    深入理解Linux RCU:RCU是读写的替代者

    请注意,在单个CPU上读写比RCU慢一个数量级,在16个CPU上读写比RCU几乎要慢两个数量级。随着CPU数量的增加,RCU的扩展性优势越来越突出。可以这么说,RCU几乎就是水平扩
    的头像 发表于 05-10 09:13 1.1w次阅读
    深入理解Linux RCU:RCU是<b class='flag-5'>读写</b><b class='flag-5'>锁</b>的替代者

    分布式的基本原理和案例实现

    前面我们有聊过乐观和悲观实现,均是对于单体架构的场景下的实现。那么现在我们来总结看下分布式情况下如何实现
    的头像 发表于 07-01 14:53 3328次阅读
    分布式<b class='flag-5'>锁</b>的基本原理和案例<b class='flag-5'>实现</b>

    详谈Linux操作系统的三种状态的读写

    读写是另一种实现线程间同步的方式。与互斥量类似,但读写将操作分为读、写两种方式,可以多个线程同时占用读模式的
    的头像 发表于 09-27 14:57 3113次阅读

    MySQL是怎么加行级的?有什么规则

    是不是很多人都对 MySQL 加行级规则搞的迷迷糊糊,对记录一会加的是 next-key ,一会加是间隙,一会又是记录
    的头像 发表于 11-17 09:28 803次阅读

    如何用C++11实现自旋

    下面我会分析一下自旋,并代码实现自旋和互斥的性能对比,以及利用C++11实现自旋。 一:
    的头像 发表于 11-11 16:48 1426次阅读
    如何用C++11<b class='flag-5'>实现</b>自旋<b class='flag-5'>锁</b>

    如何实现Redis分布式

    机制,下面将详细介绍如何实现Redis分布式。 一、引言 在分布式系统中,多个节点可能同时读写同一共享资源。如果没有实现互斥访问和同步机制,就会产生数据不一致和竞态条件等问题。解决这
    的头像 发表于 12-04 11:24 698次阅读

    互斥和自旋实现原理

    保护共享资源不被多个线程同时访问。它的实现原理主要包括以下几个方面: 1. 的初始化 互斥锁在创建时需要进行初始化,通常包括设置的状态为“未锁定”。在某些实现中,还需要初始化
    的头像 发表于 07-10 10:07 484次阅读