go锁--读写锁

每个锁分为读锁和写锁,写锁互斥
没有加写锁时,多个协程都可以加读锁
加了写锁时,无法加读锁,读协程排队等待
加了读锁,写锁排队等待

Mutex用来写协程之间互斥等待
读协程使用readerSem等待写锁的释放
写协程使用writerSem等待读锁的释放
readerCount记录读协程个数
readerWait记录写协程之前的读协程个数

写锁

先加互斥锁,readerCount变成0  并且把他变成 -rwmutexMaxReaders,写锁增加成功

表示有3个协程增加了读锁

将readerCount=3-rwmutexMaxReaders  表示前面有3个读锁,负数表示有写锁等待

readerWait=3  3个读锁即将释放

先加mutex写锁,若已经被加写锁会阻塞等待
将readerCount变为负值,阻塞读锁的获取
计算需要等待多少个读协程释放如果需要等待读协程释放,陷入writerSem

解写锁

将readerCount变为正值,允许读锁的获取
释放在readerSem中等待的读协程
解锁mutex

读锁:

将给readerCount无脑加一
如果readerCount是正数,加锁成功
如果readerCount是负数,说明被加了写锁,陷入readerSem

解读锁

给readerCount减-
如果readerCount是正数,解锁成功
如果readerCount是负数,有写锁在排队

如果自己是readerWait的最后一个,唤醒写协程

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

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

相关文章

Android Native Code开发学习(三)对java中的对象变量进行操作

Android Native Code开发学习(三) 本教程为native code学习笔记,希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04,当然windows也是可以的,区别不大 对java中的对象变量进行操作 首先我们新建一个java的类 pub…

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB

一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法(multi-objective artificial hummingbird algorithm&…

跨数据中心Multi-Fabric解决方案:L2和L3网络的高效连接和扩展

云数据中心里,为什么需要DCI互通? 云化数据中心,网络资源通过虚拟化技术形成资源池,实现业务与物理网络解耦,通过网络虚拟化,物理网络资源可以被分成多个虚拟网络资源,从而提高网络资源的使用效…

设计模式之装饰者模式

文章目录 星巴克咖啡订单项目(咖啡馆)方案 1-解决星巴克咖啡订单项目方案 1-解决星巴克咖啡订单问题分析方案 2-解决星巴克咖啡订单(好点)方案 2-解决星巴克咖啡订单问题分析装饰者模式定义装饰者模式原理装饰者模式解决星巴克咖啡订单装饰者模式下的订单…

【LeetCode算法系列题解】第51~55题

CONTENTS LeetCode 51. N 皇后(困难)LeetCode 52. N 皇后 II(困难)LeetCode 53. 最大子序和(中等)LeetCode 54. 螺旋矩阵(中等)LeetCode 55. 跳跃游戏(中等) …

跨站请求伪造(CSRF)攻击与防御原理

跨站请求伪造(CSRF) 1.1 CSRF原理 1.1.1 基本概念 跨站请求伪造(Cross Site Request Forgery,CSRF)是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&a…

Debian离线安装mysql

PS:虽然已经分享了很多安装各种环境订的教程,但是每个客户的环境不一样,那就得重新来一次,其实都是大同小异的,但是里面其实也是存在不少坑的,今天我们就来安装一个新的东西,Debian 11离线安装mysql,为什么…

Linux命令200例:bc是用于数学计算的高级计算器

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师&#xff0…

单片机通用学习-​什么是寄存器?​

什么是寄存器? 寄存器是一种特殊的存储器,主要用于存储和检查微机的状态。CPU寄存器用于存储和检查CPU的状态,具体包括计算中途数据、程序因中断或子程序分支时的返回地址、计算结果为零时的负值、计算结果为零时的信息、进位值等。 由于CP…

基于Yolov5的摄像头吸烟行为检测系统(pytoch)

目录 1.数据集介绍 1.1数据集划分 1.2 通过voc_label.py生成txt 1.3 小目标定义 2.基于Yolov5的吸烟行为检测性能提升 2.1采用多尺度提升小目标检测精度 2.2 多尺度训练结果分析 2.3基于多尺度基础上加入BiFormer: 基于动态稀疏注意力构建高效金字塔网络架构 2.3.1 BiFo…

css让元素保持等比例宽高

使用新属性 aspect-ratio: 16/9; 代码示例 <style>div {width: 60%;/* 等比例宽高 */aspect-ratio: 16/9;background-color: red;margin: auto;}</style> </head><body><div></div> </body>示例 aspect-ratio兼容性

分布式系统的多数据库,实现分布式事务回滚(1.7.0 seata整合2.0.4nacos)

正文 1、解决的应用场景是分布式事务&#xff0c;每个服务有独立的数据库。 2、例如&#xff1a;A服务的数据库是A1&#xff0c;B服务的数据库是B2&#xff0c;A服务通过feign接口调用B服务&#xff0c;B涉及提交数据到B2&#xff0c;业务是在B提交数据之后&#xff0c;在A服…

SpringBoot集成WebSocket

SpringBoot集成WebSocket 项目结构图 项目架构图 前端项目 socket.js 注意前端这里的端口是9000, 路劲是ws开头 function createScoket(token){var socket;if(typeof(WebSocket) "undefined") {console.log("您的浏览器不支持WebSocket");}else{var ho…

git 提交错误,回滚到某一个版本

git log 查看版本号 commit 后面跟的就是版本号git reset --hard 版本号 &#xff08;就可以回滚到你要去的版本&#xff09;git push -f &#xff08;因为本地回滚了&#xff0c;所以和远程会差几个版本。所以这时候只有强制推送&#xff0c;覆盖远程才可以&#xff09;

【AIGC专题】Stable Diffusion 从入门到企业级实战0401

一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第01节&#xff0c; 利用Stable Diffusion ControlNet Inpaint模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生…

常用命令之mysql命令之show命令

一、mysql show命令简介 mysql数据库中show命令是一个非常实用的命令&#xff0c;SHOW命令用于显示MySQL数据库中的信息。它可以用于显示数据库、表、列、索引和用户等各种对象的信息。我们常用的有show databases&#xff0c;show tables&#xff0c;show full processlist等&…

10.Redis 渐进式遍历

Redis 渐进式遍历 渐进式遍历scan 渐进式遍历 keys 命令一次性的把整个redis中所有的key都获取到&#xff0c;keys *但这个操作比较危险&#xff0c;可能会一下子得到太多的key,阻塞 redis 服务器。 通过渐进式遍历&#xff0c;就可以做到&#xff0c;既可以获取到所有的 key&…

在PHP8中遍历数组-PHP8知识详解

所谓遍历数组就是把数组中的变量值读取出来。遍历数组中的所有元素对程序员来说是经常使用的操作&#xff0c;通过遍历数组可以完成数组元素的查询工作。 这好比你去商场买东西一样&#xff0c;要买什么东西&#xff0c;就去该区域浏览一遍&#xff0c;以便找出适合自己的产品…

css伪类first-child,last-child,写在当前要选择的标签上

.text-box{margin-top: 14px;& span:first-child{color:red;} } CSS - 选中最后一个元素&#xff08;选择器&#xff09;_css最后一个元素选择器_王佳斌的博客-CSDN博客

springboot自动装配原理,手写一个starter。

文章目录 springboot自动装配原理手写starter手写starter总结&#xff1a; springboot自动装配原理 口述&#xff1a; springboot自动装配的话它其实就是只需要我们添加一个starter起步依赖&#xff0c;它就能完成这个依赖组件相关Bean的自动注入&#xff0c;其实就是自动的将…