Linux读写锁相关函数及操作

读写锁:

概念:读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。(写独占,读共享)。

读写锁使用场所:

读写锁非常适合对数据结构读的次数远大于写的情况(可以同时读)

特性:

读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞;

读写锁 是“读模式加锁”时,如果线程以读模式对其加锁就会成功;如果线程以写模式加锁会阻塞;

读写锁是“读模式加锁”时,既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式加锁,优先满足写模式加锁读锁,写锁并行阻塞,写锁优先级高。

例如:

线程A加写锁成功,线程B请求读锁

->B锁阻塞,等A解锁后,B加锁成功

线程A加读锁成功,线程B请求写锁

->B锁阻塞,等A解锁后,B加锁成功

线程A拥有读锁,线程B请求B锁

->线程B加锁成功

线程A持有读锁,然后线程B请求写锁,然后线程C请求读锁

->线程B和C都阻塞;

->当A释放锁之后,B先获得锁,C阻塞;

->当B释放锁后,C获得锁;

线程A持有读锁,然后线程B请求读锁,然后线程C请求写锁

->线程B获得锁成功,线程C要等AB释放锁后才能获得锁

线程A持有写锁,然后线程B请求读锁,然后线程C请求写锁

->线程B和C都阻塞;

->当A释放锁之后,C先获得锁,B阻塞;

->当C释放锁后,B获得锁;

读写锁相关函数:

pthread_rwlock_t函数:

函数描述:定义一把锁;

pthread_rwlock_init函数:

函数描述:初始化读写锁

函数原型:int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
           const pthread_rwlockattr_t *restrict attr);

函数参数:rwlock-读写锁  attr-读写锁属性,传NULL

pthread_relock_destroy函数:

函数描述:销毁锁;

函数原型:int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

pthread_rwlock_rdlock函数:

函数描述:加读锁

函数原型:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

pthread_rwlock_tryrdlock函数:

函数描述:尝试加读锁,不会阻塞;

函数原型:int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

pthread_rwlock_wrlock函数:

函数描述:加写锁;

函数原型:int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

pthread_rwlock_trywrlock函数:

函数描述:尝试加写锁,不会阻塞;

函数原型:int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

pthread_rwlock_unlock函数:

函数描述:解锁;

函数原型: int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

案例:

创建3个线程写共享资源,五个线程读共享资源

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>
int num=1;
//定义一把锁
pthread_rwlock_t rwlock;
void * thread_w(void *arg)
{int n=*(int *)arg;int i=0;for(;i<10;i++){pthread_rwlock_wrlock(&rwlock);num++;printf("[%d]write num=[%d]\n",n,num);pthread_rwlock_unlock(&rwlock);}
}
void *thread_r(void *arg)
{int n=*(int *)arg;pthread_rwlock_rdlock(&rwlock);printf("[%d]read num==[%d]\n",n,num);pthread_rwlock_unlock(&rwlock);
}
int main()
{pthread_rwlock_init(&rwlock,NULL);//初始化锁pthread_t thread[8];int arr[8];int i=0;for(;i<3;i++){arr[i]=i;pthread_create(&thread[i],NULL,thread_w,&arr[i]);}for(;i<8;i++){arr[i]=i;pthread_create(&thread[i],NULL,thread_r,&arr[i]);}int j=0;for(;j<8;j++){pthread_join(thread[j],NULL);}pthread_rwlock_destroy(&rwlock);//销毁锁printf("final num==[%d]\n",num);return 0;
}

结果:

可以看到五个读线程时可以同时进行的。 

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

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

相关文章

AI未来10年展望

人工智能&#xff08;AI&#xff09;在过去十年中迅速发展&#xff0c;其未来有望取得更加引人注目的发展。 在本文中&#xff0c;我们将探讨人工智能的未来 10 年以及我们对未来十年的期望。 我们将解决一些关键问题&#xff0c;以全面概述人工智能的未来。 1、10年后AI会发展…

Automated Testing for LLMOps 01:使用CircleCI进行持续集成CI

Automated Testing for LLMOps 这是学习https://www.deeplearning.ai/short-courses/automated-testing-llmops/ 这门课的笔记 Learn how LLM-based testing differs from traditional software testing and implement rules-based testing to assess your LLM application. …

基于最小二乘正弦拟合算法的信号校正matlab仿真,校正幅度,频率以及时钟误差,输出SNDR,SFDR,ENOB指标

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 最小二乘正弦拟合 4.2 SNDR、SFDR 和 ENOB 计算 4.3 校正 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................…

第四十五回 病关索大闹翠屏山 拚命三火烧祝家店-Python函数接受任意关键字参数

官府得到上报&#xff0c;被杀死的僧人是报恩寺的裴如海&#xff0c;旁边的头陀是寺后面的人叫胡道。孔目说他们两个互相杀死&#xff0c;没有其他人什么事&#xff0c;这件事也就过去了。 杨雄听说了这件事&#xff0c;知道是石秀干的&#xff0c;找石秀为自己错怪他道歉。两…

C++ 设计模式

文章目录 类图泛化实现关联聚合组合依赖总结 类内部的三种权限&#xff08;公有、保护、私有&#xff09;类的三种继承方式描述与图总结 面向对象七大原则单一职责原则&#xff08;Single Responsibility Principle&#xff09;里氏替换原则&#xff08;Liskov Substitution Pr…

Python is not set from command line or npm configuration 报错解决

问题 在 npm install 的过程中提示 Python is not set from command line or npm configuration 的报错&#xff0c;相信不少朋友都遇到过&#xff0c;出现这个问题的原因是缺少 python 环境所导致的。 解决方法 1、安装 python 官网&#xff1a;https://www.python.org/dow…

DVWA 靶场 SQL 注入报错 Illegal mix of collations for operation ‘UNION‘ 的解决方案

在 dvwa 靶场进行联合 SQL 注入时&#xff0c;遇到报错 Illegal mix of collations for operation UNION 报错如下图&#xff1a; 解决办法&#xff1a; 找到文件 MySQL.php 大致位置在 \dvwa\includes\DBMS 目录下 使用编辑器打开 检索 $create_db 第一个就是 在 {$_DVW…

android开发电子书,android基础编程

内存泄漏是什么&#xff1f; 内存泄漏即 ML &#xff08;Memory Leak&#xff09; 指 程序在申请内存后&#xff0c;当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象 内存泄漏有哪些情况&#xff0c;对应的解决方案&#xff1f; 内存泄漏的原因归根到底就是当需…

用OpenArk查看Windows 11电脑中全部快捷键并解决热键冲突问题

本文介绍在Windows电脑中&#xff0c;基于OpenArk工具&#xff0c;查看电脑操作系统与所有软件的快捷键&#xff0c;并对快捷键冲突加以处理的方法。 最近&#xff0c;发现有道词典的双击Ctrl功能失效了&#xff0c;不能很方便地翻译界面中的英语&#xff1b;所以&#xff0c;就…

Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

UE5 UE4 不同关卡使用Sequence动画

参考自&#xff1a;关于Datasmith导入流程 | 虚幻引擎文档 (unrealengine.com) 关卡中的Sequence动画序列&#xff0c;包含特定关卡中的Actor的引用。 将同一个Sequcen动画资源放入其他关卡&#xff0c;Sequence无法在新关卡中找到相同的Actor&#xff0c;导致报错。 Sequen…

unity 场景烘焙中植物叶片(单面网络)出现的白面

Unity版本 2021.3.3 平台 Windows 在场景烘焙中烘焙植物的模型的时候发现植物的叶面一面是合理的&#xff0c;背面是全白的&#xff0c;在材质球上勾选了双面烘焙&#xff0c;情况如下 这个问题可能是由于植物叶片的单面网格导致的。在场景烘焙中&#xff0c;单面网格只会在一…

饲料厂设备机器有哪些

饲料厂设备机器有哪些 &#xff1f; 饲料厂设备机器主要涉及到物料的加工、压制和混合过程。首先&#xff0c;物料会经过饲料粉碎的处理&#xff0c;使其颗粒细小。然后&#xff0c;物料会经过颗粒饲料机的压制&#xff0c;形成颗粒状的饲料。最后&#xff0c;颗粒饲料会通过混…

map和set的简单介绍

由于博主的能力有限&#xff0c;所以为了方便大家对于map和set的学习&#xff0c;我放一个官方的map和set的链接供大家参考&#xff1a; https://cplusplus.com/ 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque&#x…

TypeScript+React Web应用开发实战

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在现代Web开发中&#xff0c;React和TypeScrip…

c#/ .net8 香橙派orange pi +SSD1306 oled显示屏 显示中文+英文 实例

本文使用香橙派orangepi pi 3ltsSSD1306 oled显示屏作为例子&#xff0c;其它型号的也是一样使用的 在nuget包中安装 Sang.IoT.SSD1306; 以下两个二选一 SkiaSharp;//在window下运行装这个 SkiaSharp.NativeAssets.Linux.NoDependencies;//在linux下运行一定要装这个 在c# .ne…

unity shaderGraph实例-物体线框显示

文章目录 本项目基于URP实现一&#xff0c;读取UV网格&#xff0c;由自定义shader实现效果优缺点效果展示模型准备整体结构各区域内容区域1区域2区域3区域4shader属性颜色属性材质属性后处理 实现二&#xff0c;直接使用纹理&#xff0c;使用默认shader实现优缺点贴图准备材质准…

普通索引和唯一索引详解

前言 面试的时候有时会问面试者&#xff0c;普通索引和唯一索引有什么区别。很多人&#xff0c;甚至工作很多年的工程师回答的千篇一律 “普通索引可以有重复的值&#xff0c;唯一索引不能有重复的值”。于是我又问&#xff0c;这两个索引这两个索引效率哪个高&#xff0c;很少…

腾讯云优惠购买政策大全:新老用户都来瞧瞧!

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

script中的defer和async

在HTML中&#xff0c;<script>标签可以使用async和defer两个属性来控制外部JavaScript文件的加载和执行方式。这两个属性的目的是优化页面加载时间&#xff0c;但它们以不同的方式工作。下面是每个属性的具体说明&#xff1a; async属性 当你给<script>标签添加a…