读写锁
互斥锁或自旋锁要么是加锁状态、要么是不加锁状态,而且一次只有一个线程可以对其加锁。
读写锁有3 种状态:读模式下的加锁状态(以下简称读加锁状态)、写模式下的加锁状态(以下简称写加锁状态)和不加锁状态(见),一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁。因此可知,读写锁比互斥锁具有更高的并行性!
读写锁有如下两个规则:
- 当读写锁处于写加锁状态时,在这个锁被解锁之前,所有试图对这个锁进行加锁操作(不管是以读模式加锁还是以写模式加锁)的线程都会被阻塞。
- 当读写锁处于读加锁状态时,所有试图以读模式对它进行加锁的线程都可以加锁成功;但是任何以写模式对它进行加锁的线程都会被阻塞,直到所有持有读模式锁的线程释放它们的锁为止。
读写锁非常适合于对共享数据读的次数远大于写的次数的情况。
初始化和销毁读写锁
#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下线程间通讯---读写锁和条件变量
读写锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。件变量是线程可用的一种同步机制,条件变量给多个线程提供了一个回合的场所,条件变量和互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。
Rust 语言中的 RwLock内部实现原理
Rust是一种系统级编程语言,它带有严格的内存管理、并发和安全性规则,因此很受广大程序员的青睐。RwLock(读写锁)是 Rust 中常用的线程同步机制之一,本文将详细介绍 Rust 语言
命名管道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几乎就是水平扩
详谈Linux操作系统的三种状态的读写锁
读写锁是另一种实现线程间同步的方式。与互斥量类似,但读写锁将操作分为读、写两种方式,可以多个线程同时占用读模式的
MySQL是怎么加行级锁的?有什么规则?
是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,对记录一会加的是 next-key 锁,一会加是间隙锁,一会又是记录锁。
如何实现Redis分布式锁
机制,下面将详细介绍如何实现Redis分布式锁。 一、引言 在分布式系统中,多个节点可能同时读写同一共享资源。如果没有实现互斥访问和同步机制,就会产生数据不一致和竞态条件等问题。解决这
互斥锁和自旋锁的实现原理
保护共享资源不被多个线程同时访问。它的实现原理主要包括以下几个方面: 1. 锁的初始化 互斥锁在创建时需要进行初始化,通常包括设置锁的状态为“未锁定”。在某些实现中,还需要初始化
评论