线程同步——读写锁

news2025/4/26 9:10:18

Linux——线程同步 读写锁

目录

一、基本概念

1.1 读写锁的基本概念

1.2 读写锁的优点

1.3 读写锁的实现 

1.4 代码实现


一、基本概念

线程同步中的读写锁(Read-Write Lock),也常被称为共享-独占锁(Shared-Exclusive Lock),是一种用于控制对共享资源的并发访问的同步机制。它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。读写锁的设计目的是在多线程环境中提高并发性能,特别是在读操作远多于写操作的场景中。读写锁与互斥锁区别就是读锁和写锁是分开的

1.1 读写锁的基本概念

读写锁通常由两个锁组成:

  1. 读锁(Shared Lock)允许多个线程同时获取读锁,这意味着多个线程可以同时读取共享资源。当至少有一个线程持有读锁时,其他线程不能获取写锁。

  2. 写锁(Exclusive Lock)只允许一个线程获取写锁,这意味着在任何时刻只有一个线程可以写入共享资源。当线程持有写锁时,其他线程既不能获取读锁也不能获取写锁。

1.2 读写锁的优点

  1. 提高并发性:在读取操作远多于写入操作的情况下,读写锁可以显著提高程序的并发性能,因为它允许多个线程同时读取共享资源。

  2. 避免写饥饿:由于写锁的优先级通常高于读锁,可以避免长时间只进行读操作而使写操作饥饿的情况。

  3. 灵活性:读写锁提供了一种灵活的机制来控制对共享资源的访问,可以根据实际需要选择获取读锁或写锁。

1.3 读写锁的实现 

pthread_rwlock_init 初始化读写锁

pthread_rwlock_rdlock 获取(锁定)一个读写锁以进行读取。

pthread_rwlock_wrlock 获取(锁定)一个读写锁以进行写入。

pthread_rwlock_unlock 释放一个读写锁 解锁

pthread_rwlock_destroy 销毁一个读写锁

1.4 代码实现

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>

pthread_rwlock_t lock;//定义了一个变量lock

void* fun1(void* arg)//模拟读同时进行和2
{
    for(int i=0;i<20;i++)
    {
        pthread_rwlock_rdlock(&lock);
        printf("fun1 read start:   \n");
        sleep(1);
        printf("fun1 read end:    \n");
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}

void* fun2(void* arg)//读
{
    for(int i=0;i<10;i++)
    {
        pthread_rwlock_rdlock(&lock);
        printf("fun2 read start:   \n");
        sleep(1);
        printf("fun2 read end:    \n");
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}

void* fun3(void* arg)//写 只允许一个进行
{
    for(int i=0;i<8;i++)
    {
        pthread_rwlock_wrlock(&lock);
        sleep(1);
        printf("    fun3 write start:   \n");
        sleep(1);
        printf("    fun3 write end:     \n");
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}
int main()
{
    pthread_rwlock_init(&lock,NULL);

    pthread_t id1,id2,id3;

    pthread_create(&id1,NULL,fun1,NULL);
    pthread_create(&id2,NULL,fun2,NULL);
    pthread_create(&id3,NULL,fun3,NULL);

    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    pthread_join(id3,NULL);

    pthread_rwlock_destroy(&lock);
}

读写锁允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。

  • 这里定义了一个全局的读写锁lock,用于控制对共享资源的访问。

  • 这段代码通过使用读写锁来同步多个线程对共享资源的访问。读线程可以同时访问共享资源,而写线程则需要独占访问。通过这种方式,可以有效地提高程序的并发性能,特别是在读操作远多于写操作的场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

邪性!Anaconda安装避坑细节Windows11

#工作记录 最近不断重置系统和重装Anaconda&#xff0c;配置的要累死&#xff0c;经几十次意料之外的配置状况打击之后&#xff0c;最后发现是要在在Anaconda安装时&#xff0c;一定要选“仅为我安装”这个选项&#xff0c;而不要选“为所有用户安装”这个选项。 选“仅为我安…

【大模型】激活函数之SwiGLU详解

文章目录 1. Swish基本定义主要特点代码实现 2. GLU (Gated Linear Unit)基本定义主要特点代码实现 3. SwiGLU基本定义主要特点代码实现 参考资料 SWiGLU是大模型常用的激活函数&#xff0c;是2020年谷歌提出的激活函数&#xff0c;它结合了Swish和GLU两者的特点。SwiGLU激活函…

AOA与TOA混合定位,MATLAB例程,三维空间下的运动轨迹,滤波使用EKF,附下载链接

本文介绍一个MATLAB代码&#xff0c;实现基于 到达角&#xff08;AOA&#xff09; 和 到达时间&#xff08;TOA&#xff09; 的混合定位算法&#xff0c;结合 扩展卡尔曼滤波&#xff08;EKF&#xff09; 对三维运动目标的轨迹进行滤波优化。代码通过模拟动态目标与基站网络&am…

【211】线上教学系统

--基于SSM线上教学平添 主要实现的功能有&#xff1a; 管理员 : 首页、个人中心、学员管理、资料类型管理、学习资料管理、交流论坛、我的收藏管理、试卷管理、留言板管理、试题管理、系统管理、考试管理。 学员 : 首页、个人中心、我的收藏管理、留言板管理、考试管理。 前台…

从混乱思绪到清晰表达:记录想法如何改变你的学习人生

关键要点 • 记录想法似乎是发现自己想法并将其组织成可传播形式的最佳理由&#xff0c;研究表明写作和教学能增强学习和理解。 • 证据倾向于支持写作有助于澄清思想&#xff0c;而教学通过“教授效应”深化知识。 • 教学和分享被认为是最有效的学习方法&#xff0c;这与记录…

电机控制常见面试问题(二十)

文章目录 一.整流电路绕组接法二.电机为什么需要转速器三.电机转矩产生原理四.电机控制中载波频率大小的确定五.开关周期 Tpwm 一.整流电路绕组接法 为了引出直流的输出&#xff0c;一定要在整流变压器的二次侧引出零线&#xff0c;所以二次侧绕组必须接成星形 一次绕组必须要…

小爱控制via电视浏览器搜索图片-Homeassistant重制上一个自动化

制作自动化详情 为了完成图片搜&#xff0c;暂定指令找找{描述} 在执行脚本的adb地方输入以下指令&#xff0c;百度 因安全不让在图片地址直接搜转用bing >- >am start -n mark.via.gp/mark.via.Shell -a android.intent.action.VIEW -d https://cn.bing.com/images/…

unity一个图片的物体,会有透明的效果

如图 想要去掉这个透明效果 选择一个高层级的layer即可。

docker网桥问题导致ldap组件安装失败分析解决

使用pass_install_x86_64_0124版部署k8s底座、kem&#xff1b; 问题&#xff1a;一台kem节点部署ldap组件失败 解决&#xff1a;恢复问题主机的docker0网卡&#xff0c;重新部署kem相关组件 二、问题详情 现象描述 ansible部署kem组件 TASK [kem : start ldap] **********…

【Python】pillow库学习笔记1-Image类

《Python语言程序设计基础 》第3版&#xff0c;嵩天 黄天羽 杨雅婷著&#xff0c;P293 1.pillow库概述 Pillow 库是Python图像处理重要的第三方库。 Pillow库是PIL (Python image library) 库的一个扩展&#xff0c;需要通过pip工具安装。安装PIL库需要注意&#xff0c;安装…

智能网联交通加速落地,光路科技TSN技术助推车路云一体化发展

今日&#xff0c;为期两天的第二十七届高速公路信息化大会在青岛国际会展中心&#xff08;红岛馆&#xff09;圆满落幕。本次大会以“数智转型安全”为主题&#xff0c;聚焦高速公路数字化转型、车路云协同以及新一代信息技术的融合应用。会议汇聚了交通行业的专家学者、企业代…

boost.asio

as&#xff08;async&#xff09;:异步 同步io&#xff1a; reactor (非阻塞)&#xff08;需要注册一次&#xff0c;在等待消息时可以干别的事&#xff09; 阻塞io网络模型 接口&#xff1a;read\accept\connect\write 接口返回时&#xff0c;io完成 异步…

当贝AI知识库评测 AI如何让知识检索快人一步

近日,国内领先的人工智能服务商当贝AI正式推出“个人知识库”功能,这一创新性工具迅速引发行业关注。在信息爆炸的时代,如何高效管理个人知识资产、快速获取精准答案成为用户的核心需求。当贝AI通过将“闭卷考试”变为“开卷考试”的独特设计,为用户打造了一个高度个性化的智能…

深度解读:智能体2.0 AI Agent多推演进

AI Agent即AI 代理&#xff0c;长期以来&#xff0c;研究人员一直在追求更完美的AI&#xff0c;可以与人类相当、甚至是超越人类。在1950年代&#xff0c;AIan Turing就将“智能”的概念扩展到了人工实体&#xff0c;并提出了著名的图灵测试。这些人工智能实体就被称为——Agen…

Golang 的 GMP 调度机制常见问题及解答

文章目录 Golang GMP 调度模型详解常见问题基础概念1. GMP 各组件的作用是什么&#xff1f;2. 为什么 Go 需要自己的调度器&#xff1f;3. GOMAXPROCS 的作用是什么&#xff1f; 调度流程4. Goroutine 如何被调度到 M 上执行&#xff1f;5. 系统调用会阻塞整个线程吗&#xff1…

项目-苍穹外卖(十五) Apache ECharts+数据统计

一、介绍 二、营业额统计 需求分析和设计&#xff1a; Controller: Service: /*** 营业额统计* param begindate* param enddate* return* */Overridepublic TurnoverReportVO turnoverStatistics(LocalDate begindate, LocalDate enddate) {//创建时间集合List<LocalDate&…

Spring Data审计利器:@LastModifiedDate详解(依赖关系补充篇)!!!

&#x1f552; Spring Data审计利器&#xff1a;LastModifiedDate详解&#x1f525;&#xff08;依赖关系补充篇&#xff09; &#x1f50c; 核心依赖解析 使用LastModifiedDate必须知道的依赖关系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…

Tweak Power:全方位电脑系统优化的高效工具

Tweak Power&#xff08;系统&#xff09; Tweak Power是一款功能强大的系统优化工具&#xff0c;专为提升Windows电脑的性能和稳定性而设计。它提供了全面的清理、优化和调整选项&#xff0c;帮助用户轻松管理系统资源、提高运行速度、延长设备寿命。 快速扫描并清理系统垃圾…

CLion下载安装(Windows11)

目录 CLion工具下载安装其他 CLion CLion-2024.1.4.exe 工具 系统&#xff1a;Windows 11 下载 1.通过百度网盘分享的文件&#xff1a;CLion-2024.1.4.exe 链接&#xff1a;https://pan.baidu.com/s/1-zH0rZPCZtQ60IqdHA7Cew?pwdux5a 提取码&#xff1a;ux5a 安装 打开…

如何用 Postman 进行高效的 Mock 测试?

Postman 是一个强大的 API 开发和测试工具&#xff0c;它可以让你轻松地创建和发送各种 HTTP 请求&#xff0c;查看响应结果&#xff0c;并进行调试和优化。但是有时候&#xff0c;你可能还没有开发好后端服务&#xff0c;或者想要模拟不同的响应场景&#xff0c;这时候就可以使…