Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POSIX读写锁

POSIX读写锁

作者头像
zy010101
发布于 2020-05-18 07:50:33
发布于 2020-05-18 07:50:33
1.1K00
代码可运行
举报
文章被收录于专栏:程序员程序员
运行总次数:0
代码可运行

续接上一篇“线程同步”:https://cloud.tencent.com/developer/article/1629556

本文讲述读写锁。读写锁和互斥量不太一样,它允许锁可以是读加锁,写加锁以及未加锁三种状态。每次只能由一个线程处于写加锁状态,但是可以有多个线程处于读加锁状态。

读写锁是一把锁,不是两把锁。它就像是多路开关一样。当锁处于写加锁状态时,所有其他试图对这个锁进行读加锁或者写加锁的线程都会被阻塞;当锁处于读加锁状态时,所有试图对这个锁进行读加锁的线程头可以得到访问权,而所有试图对这个锁进行写加锁的线程都会被阻塞。

读写锁很明显带来了比互斥量更高的并发性。并且读写锁非常适合读取比写入操作更多的情况。有的教材会把读写锁也称为“共享互斥锁”。当读写锁以写模式锁住,称之为“共享模式锁住”;而当读写锁以读模式锁住,称之为“互斥模式锁住”。

下面是供我们在POSIX下进行读写锁初始化和反向初始化的函数。

下面是与写加锁的函数。

下面是与读加锁的函数。

由于读写锁是一把锁,因此在解锁的时候无论你是读加锁,还是写加锁,都是使用下面的解锁函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

 
char str[30];               //共享资源
pthread_rwlock_t rwlock;    //读写锁
 
void *th_write(void *arg)
{
    usleep(300);            //延时
    pthread_rwlock_wrlock(&rwlock);
    strcpy(str,"123");
    pthread_rwlock_unlock(&rwlock);
    pthread_exit(NULL);
}
 
void *th_read(void *arg)
{
    pthread_rwlock_rdlock(&rwlock);
    printf("read: %s\n",str);
    pthread_rwlock_unlock(&rwlock);
    pthread_exit(NULL);
}

int main(void)
{
    int i;
    pthread_t tid[8];
    strcpy(str,"Hello World!");
    pthread_rwlock_init(&rwlock, NULL);     //初始化锁
    
    

    for (i = 0; i<3; i++)       //3和写线程
        pthread_create(&tid[i], NULL, th_write, NULL);

    for (i = 0; i<5; i++)       //5个读线程
        pthread_create(&tid[i+3], NULL, th_read, NULL);
        
    for (i = 0; i<8; i++)       //等待线程结束,回收线程
        pthread_join(tid[i], NULL);
        
    pthread_rwlock_destroy(&rwlock);    //销毁锁
        
    return 0;        
}

运行结果如下:

可以看到,可以多个读线程去访问读加锁的资源。并且写加锁只能被某个线程独自访问。其余线程都在阻塞。并且等待线程中的写加锁线程比读加锁线程优先级高。

总结一下:

读共享,写独享;写必读优先级高。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量
---- Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。 同步和互斥 互斥:多线程中互斥是指多个线程访问同一资源时同时只允许一个线程对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的; 同步:多线程同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
Linux兵工厂
2023/02/28
3.9K0
详解Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量
【线程同步】读写锁
读写锁是一种与互斥量类似的锁,它允许更高的并行性,具有写独占,读共享的特点。读写锁总共有三种状态:
mindtechnist
2024/08/08
1350
【线程同步】读写锁
【Linux】:多线程(读写锁 && 自旋锁)
🔥 读写锁(Read-Write Lock)是一种用于多线程环境下同步访问共享资源的锁。它与传统的互斥锁(Mutex)有所不同,提供了更细粒度的控制,以便提高并发性能。它允许多个线程同时 读取 数据,但在写入数据时,必须确保只有一个线程可以进行写操作,并且在写操作期间,所有的读操作都必须等待。
IsLand1314
2024/12/20
3720
【Linux】:多线程(读写锁 && 自旋锁)
多线程编程C语言版
什么是多线程,提出这个问题的时候,我还是很老实的拿出操作系统的书,按着上面的话敲下“为了减少进程切换和创建开销,提高执行效率和节省资源,我们引入了线程的概念,与进程相比较,线程是CPU调度的一个基本单位。”
DeROy
2021/11/16
3.7K0
多线程编程C语言版
【在Linux世界中追寻伟大的One Piece】读者写者问题与读写锁
通过对比可以看出,读者写者模型更适合于数据的并发读取,而生产消费者模型更适合于数据的生产和消费。在实际应用中,应根据具体的业务需求选择合适的模型。
枫叶丹
2024/12/04
1460
linux中实现线程同步的6种方法
最后运行的结果不是固定的,有可能是0、-1,如果有这个ticket_num变量代表是库存的话,那么就会出现库存为负数的情况,所以需要引入线程同步来保证线程安全。
全栈程序员站长
2022/09/14
9210
C++读写锁介绍_数据库读写锁
先看看互斥锁,它只有两个状态,要么是加锁状态,要么是不加锁状态。假如现在一个线程a只是想读一个共享变量 i,因为不确定是否会有线程去写它,所以我们还是要对它进行加锁。但是这时又有一个线程b试图去读共享变量 i,发现被锁定了,那么b不得不等到a释放了锁后才能获得锁并读取 i 的值,但是两个读取操作即使是同时发生的,也并不会像写操作那样造成竞争,因为它们不修改变量的值。所以我们期望在多个线程试图读取共享变量的时候,它们可以立刻获取因为读而加的锁,而不是需要等待前一个线程释放。
全栈程序员站长
2022/09/22
9010
Linux学习——浅谈读写锁的使用
读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的。 读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步,
全栈程序员站长
2022/09/22
1.8K0
Linux学习——浅谈读写锁的使用
linux读写锁
2. 读写锁是“读模式加锁”时, 如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞。
全栈程序员站长
2022/09/22
3.5K0
【Linux】读者写者问题与读写锁
在读者写者问题中,读者与读者是并发的,不同读者之间不会互相影响,因为只是访问数据,并不会读数据进行修改。写者与写者是互斥的,临界资源只能让一个写者进行书写。读者与写者的关系比较复杂,是互斥与同步,读写不能同时进行,读完了要与写进行同步,写完了要与读同步。
叫我龙翔
2024/09/08
2840
【Linux】读者写者问题与读写锁
封装pthread_rwlock读写锁,实现嵌套调用
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/82969947
10km
2019/05/25
1.9K0
Linux线程互斥学习笔记--详细分析
    在Linux下, 线程的互斥量数据类型是pthread_mutex_t 在使用前, 要对它进行初始化:
用户6754675
2019/12/09
8330
Linux系统编程-(pthread)线程通信(读写锁)
​ 1. 读写锁有三种状态,读模式下加锁(共享)、写模式下加锁(独占)以及不加锁。
DS小龙哥
2022/02/17
1.5K0
Linux系统编程-(pthread)线程通信(读写锁)
Linux内核编程--进程控制,线程控制,锁机制
每个进程都有一个非负整型表示的唯一进程ID。进程ID是可复用的,当一个进程终止后,其进程ID也会被其他进程使用。
Coder-ZZ
2022/05/09
1.2K0
Linux内核编程--进程控制,线程控制,锁机制
linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题
文章主要介绍了在Linux系统中,如何利用自旋锁来实现线程之间的同步和互斥。主要包括了自旋锁的定义、工作原理、使用方式和注意事项,并通过实例介绍了如何在C语言中实现自旋锁。
s1mba
2017/12/28
1.6K0
linux读写锁_共享内存读写锁
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169974.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
6.6K0
linux读写锁_共享内存读写锁
【Linux】多线程(自旋锁、读写锁)
自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况。但是不合理的使用,可能会造成 CPU 的浪费。
秦jh
2024/12/03
2880
【Linux】多线程(自旋锁、读写锁)
嵌入式Linux:线程同步(读写锁)
在Linux中,读写锁(Read-Write Lock)提供了一种同步机制,允许多个线程并发读取共享资源,但只有一个线程可以对该资源进行写操作。
不脱发的程序猿
2025/02/18
1770
嵌入式Linux:线程同步(读写锁)
Linux同步机制(一) - 线程锁
1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步。 这时可以用互斥锁来完成任务。互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destory pthread_mutex_lock pthread_mutex_unlock 这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。 1.1 锁的创建 锁可以被动态或静态创建,可以用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,采用这种方式比较容易理解,互斥锁是pthread_m
三丰SanFeng
2018/01/16
3.6K0
线程同步与互斥
不是什么时候都要靠上锁的。从根源出发,我们为什么需要上锁?因为线程在使用资源的过程中可能会出现冲突,对于这种会出现冲突的资源,还是锁住轮着用比较好。
看、未来
2021/10/09
8960
线程同步与互斥
推荐阅读
相关推荐
详解Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验