什么是读写锁
读写锁
读写锁有3 种状态:读模式下的加锁状态、写模式下的加锁状态和不加锁状态,一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁。因此可知,读写锁比互斥锁具有更高的并行性!
读写锁的规则
读写锁有如下两个规则:
当读写锁处于写加锁状态时,在这个锁被解锁之前,所有试图对这个锁进行加锁操作(不管是以读模式加锁还是以写模式加锁)的线程都会被阻塞。
当读写锁处于读加锁状态时,所有试图以读模式对它进行加锁的线程都可以加锁成功;但是任何以写模式对它进行加锁的线程都会被阻塞,直到所有持有读模式锁的线程释放它们的锁为止。
虽然各操作系统对读写锁的实现各不相同,但当读写锁处于读模式加锁状态,而这时有一个线程试图以写模式获取锁时,该线程会被阻塞;而如果另一线程以读模式获取锁,则会成功获取到锁,对共享资源进行读操作。
所以,读写锁非常适合于对共享数据读的次数远大于写的次数的情况。当读写锁处于写模式加锁状态时,它所保护的数据可以被安全的修改,因为一次只有一个线程可以在写模式下拥有这个锁;当读写锁处于读模式加锁状态时,它所保护的数据就可以被多个获取读模式锁的线程读取。所以在应用程序当中,使用读写锁实现线程同步,当线程需要对共享数据进行读操作时,需要先获取读模式锁(对读模式锁进行加锁),当读取操作完成之后再释放读模式锁(对读模式锁进行解锁);当线程需要对共享数据进行写操作时,需要先获取到写模式锁,当写操作完成之后再释放写模式锁。
读写锁也叫做共享互斥锁。当读写锁是读模式锁住时,就可以说成是共享模式锁住。当它是写模式锁住时,就可以说成是互斥模式锁住。
代码
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>//共享的数据
int count = 0;//定义读写锁
pthread_rwlock_t rwlock;void *th_write(void *arg)
{int temp;int i = (int)arg;while(1){temp = count;usleep(1000);//加写锁pthread_rwlock_wrlock(&rwlock);//对共享资源count进行写操作printf("***write %d: %lu count=%d ++count=%d\n",i,pthread_self(),temp,++count);//解锁pthread_rwlock_unlock(&rwlock);usleep(9000);}return NULL;
}void *th_read(void *arg)
{int i = (int)arg;while(1){//加读锁pthread_rwlock_rdlock(&rwlock);//对共享资源count进行写操作printf("---read %d: %lu :%d\n",i,pthread_self(),count);//解锁pthread_rwlock_unlock(&rwlock);usleep(9000);}return NULL;
}int main()
{int i;pthread_t thread[8];//初始化读写锁pthread_rwlock_init(&rwlock,NULL);//创建3个写线程for(i = 0;i < 3;i++){pthread_create(&thread[i],NULL,th_write,(void*)i);}//创建5个读线程for(i = 3;i < 8;i++){pthread_create(&thread[i],NULL,th_read,(void*)i);}//阻塞回收线程for(i = 0;i < 8;i++){pthread_join(thread[i],NULL);}//销毁读写锁pthread_rwlock_destroy(&rwlock);return 0;}
相关文章:
什么是读写锁
读写锁 读写锁有3 种状态:读模式下的加锁状态、写模式下的加锁状态和不加锁状态,一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁。因此可知,读写锁比互斥锁具有更高的并行性! 读…...
低代码助力企业数字化转型
在当今这个数字化快速发展的时代,企业面临的竞争越来越激烈,数字化转型已成为企业发展的必经之路。低代码平台作为一种新型的开发工具,正在逐渐成为企业数字化转型的重要助力。本文将从数字化转型背景、低代码平台介绍、低代码平台的应用、低…...
Linux 作业
一. 题目 二.作业内容 第一题: 因老师要求上传安装后远程连接XShell截图,如下: 制作yum缓存:[rootRHEL8 ~]# yum makecache 安装gcc:[rootRHEL8 ~]# yum install gcc -y 制作快照:快照,初始 s…...
【数据分享】2005-2022年全国民航机场客货吞吐量和起降架次数据
机场是一个城市对外联系的重要渠道,机场的旅客吞吐量和货物吞吐量是体现一个城市对外联系程度的重要指标。 本次我们给大家分享的是2005-2022年我国民航机场的旅客吞吐量、货邮吞吐量、起降架次数据。数据格式为Excel和Shp两种格式。数据坐标为WGS1984。原始数据来…...
清华博士面试的准备(已通过)
内修(30%) 不管如何 任何人都不能影响你的心态。因为冷静、理性,才能处理好95%以上的问题。剩下的5%我可以不拥有。不能既要、又要、还要。尊重客观规律。放下我执。 价值导向、解决问题为导向。 允许一切事情的发生,是我们最大的…...
requests爬虫详解
Requests 安装 pip install requests 示例 from fake_useragent import UserAgent import requestsdef cra1_1(): url http://xx/front/website/findAllTypes headers {User-Agent: UserAgent().chrome} resp requests.get(url, headersheaders) result resp.json()i…...
oracle的正则表达式(regular expression)
当前,正则表达式已经在很多软件中得到广泛的应用,包括Linux, Unix,HP等操作系统,PHP,C#,Java等开发环境,ORACLE则在10G中推出了自己的正则表达式。 Oracle 10g正则表达式提高了SQL灵活性&#…...
sh脚本 单独可以执行,放到crontab中不执行(定时清空redis)
1.原因: 执行环境的不同 2.解决办法: 添加环境变量 PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH 3. 完整示例: #!/bin/shPATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:…...
mysql 半同步复制模式使用详解
目录 一、前言 二、mysql主从架构简介 2.1 mysql主从复制架构概述 2.2 为什么使用主从架构 2.2.1 提高数据可用性 2.2.2 提高数据可靠性 2.2.3 提升数据读写性能 2.3 主从架构原理 2.4 主从架构扩展 2.4.1 双机热备(AB复制) 2.4.2 级联复制 2…...
以太坊代币标准ERC20、ERC721
两个概念 ERC(Ethereum Request for Comment) 以太坊意见征集稿EIP(Ethereum Improvement Proposals)以太坊改进提案 ERC和EIP用于使得以太坊更加完善;在ERC中提出了很多标准,用的最多的标准就是它的Token标准; 有哪些标准详细见https://eips.ethereum…...
编写基于冒泡排序算法的qsort函数
目录 1.简单认识冒泡排序 2.进入正文分析如何实现函数 3.1比较两个相邻元素的大小 3.2比较两个相邻元素大小后要换函数 4.my_qsort函数: 5.总结: 1.简单认识冒泡排序 冒泡排序的步骤如下: 比较相邻的两个元素,如果第一个元素比…...
有什么推荐使用的企业上网行为管理软件?
在当今信息化社会,企业的上网行为管理越来越重要。企业上网行为软件是一种能够监控和管理企业员工上网行为的工具,它可以帮助企业更好地管理网络资源,提高工作效率,保护企业信息安全,并符合相关的法律法规。本文将深入…...
机器学习第五课--广告点击率预测项目以及特征选择的介绍
这个项目的主要的目的是通过给定的广告信息和用户信息来预测一个广告被点击与否。 如果广告有很大概率被点击就展示广告,如果概率低,就不展示。 因为如果广告没有被点击,对双方(广告主、平台)来讲都没有好处。所以预测…...
细说tcpdump的妙用
原文地址:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 tcpdump命令最初设计用于观察TCP/IP性能问题,它是一个用于截取网络分组,并输出分组内容的工具。tcpdump可以将网络中传送的数据包的报文头完全截获下来提供分析,它支持针…...
【深度学习实验】前馈神经网络(七):批量加载数据(直接加载数据→定义类封装数据)
目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 直接加载鸢尾花数据集 a. 加载数据集 b. 数据归一化 c. 洗牌操作 d. 打印数据 2. 定义类封装数据 a. __init__(构造函数:用于初始化数据集对象) b.…...
气体放电模拟装置中1Pa~101kPa范围内的真空度控制技术
摘要:针对微间隙气体放电特性分析中需要对不同真空压力进行精密控制的要求,本文提出了相应的解决方案。解决方案采用了双路调节技术,由真空计、电控针阀和真空压力控制器组成进气和排气控制回路,可实现真空度1Pa~101kPa全量程范围…...
华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 …...
sql on条件判断是要注意null值
我是因为用了merge into语法,然后on条件中判断的字段是可配置的,这就导致了,有时候判断条件多的情况下,判断的字段会碰到有null值的情况,如果on两边的字段都是null,null和null对比就会导致结果为false&…...
9.22(一):数组扁平化
ES6的flat方法 const arr[1,2,[33,44,5,[6,7]],3]// es6中的flat方法function arr1() { //数组自带的扁平化方法,flat的参数代表的是需要展开几层, //如果是Infinity的话,就是不管嵌套几层,全部都展开return arr.flat(Infinity) } let resul…...
【vue2第十九章】手动修改ESlint错误 和 配置自动化修改ESlint错误
目标:认识代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号的左右是否需要空格”,"一句结束是否是要加;”等 为什么要使用代码规范? 在团队开发时,提高代码的可读性。 在创建项目时,我们选择的就是一套完整的代码…...
Node.js异步数据库操作:nedb-promises封装原理与实战指南
1. 项目概述:告别回调地狱,拥抱异步数据库操作 如果你在Node.js项目中用过NeDB,大概率对它的回调函数(callback)模式又爱又恨。NeDB本身是一个轻量级的嵌入式数据库,API设计简单直观,但在现代异…...
5分钟快速上手:Blender 3MF插件让你轻松实现3D打印模型转换
5分钟快速上手:Blender 3MF插件让你轻松实现3D打印模型转换 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经在Blender中精心设计了色彩丰富的3D模型…...
联发科2012年崛起:从功能机到智能机的转型与挑战
1. 从功能机到智能机的惊险一跃:联发科的2012年2012年,对于全球移动芯片行业来说,是几家欢喜几家愁的一年。诺基亚和黑莓的持续衰落,直接拖垮了像ST-Ericsson这样深度绑定的芯片供应商;即便是巨头如高通,也…...
AIAgent系统崩溃前的7个征兆:基于SITS2026容错框架的实时预警与自愈方案
更多请点击: https://intelliparadigm.com 第一章:SITS2026容错框架的理论根基与演进脉络 SITS2026(Self-Integrating Tolerance System 2026)并非凭空而生,其设计深度植根于分布式系统可靠性理论、形式化验证方法论与…...
CANN/GE图引擎Profiling初始化接口
aclgrphProfInit 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlo…...
超算联盟抗疫:430Petaflops算力如何加速病毒研究与药物发现
1. 项目概述:当超级计算遇上全球危机2020年初,一场突如其来的公共卫生危机席卷全球,科研界面临着一个前所未有的挑战:如何以最快的速度理解一种全新的病毒,并找到遏制其传播的方法?传统的药物研发和流行病学…...
基于MCP协议构建AI Agent链上数据查询与操作工具实践
1. 项目概述:一个连接加密世界与AI的“翻译官”如果你最近在捣鼓AI Agent,特别是想让它帮你分析链上数据、查询钱包余额,甚至执行一些基础的区块链操作,那你可能已经发现了一个痛点:让AI直接理解并操作区块链ÿ…...
别再复制粘贴了!手把手教你从零搭建STM32F429 MDK5工程模板(附完整源码包)
从零构建STM32F429工程模板:避开新手90%的踩坑点 第一次拿到STM32F429开发板时,我盯着满屏的英文文档和零散的教程发愣——网上能找到的要么是过时的Keil4配置指南,要么直接丢给你一个现成工程文件。这种"复制粘贴式"的学习让我在后…...
AI编程代理全景导航:从技术选型到实战评估指南
1. 项目概述:一个探索智能编码代理的“藏宝图”最近在GitHub上闲逛,发现了一个挺有意思的项目,叫tndata/CodingAgentExplorer。光看名字,你可能会觉得这又是一个关于AI代码生成或者大语言模型(LLM)的常规仓…...
3分钟掌握MarkDownload:从网页到结构化笔记的智能转换
3分钟掌握MarkDownload:从网页到结构化笔记的智能转换 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload …...
