自旋锁/读者写者问题

news2024/9/27 21:22:21

自旋锁

自旋锁的概念和理解

锁在处理需要申请加锁的线程的时候,一般有两种处理方法:一种是挂起等待,另外一种是自旋。自旋即轮询。

挂起等待:

当一个线程成功申请锁,并进入临界区后,其它线程在申请的时候会被挂起等待,即处于阻塞状态。

自旋锁:

当一个线程成功申请锁,并进入临界区后,其它线程在申请的时候会不断地来查看这个线程是否释放了锁,即不断轮询,如果释放了,就会竞争锁。

那么是什么决定了使用哪种处理方式呢?

决定于在临界区中的线程要在临界区呆多长时间。但是是没有定义时间长短的。

一般来说,我们都采用挂起等待的方式,而不会采用自旋,因为自旋会很消耗CPU资源,挂起等待不会占用CPU资源。除非我们能够确定当前情况非常适合自旋。

自旋锁的接口介绍:

加锁:

 解锁:

 自旋锁的初始化:

我们能够发现,自旋锁跟我们使用一般的锁的接口很像,比如

读者写者问题

读写锁概念

在多线程的场景下,有一种情况很常见,那就是公共数据很少会去被修改,即很多情况都是只读,然后很少写。如果在这种大多只读的情况下, 我们还要对线程进行加锁解锁等等,会有很多不必要的消耗。因此,读写锁就能够专门处理这种少写多读的情况。

读者写者跟生产消费者模型很像,其中,写者与读者的关系为互斥与 同步,写者与写者的关系为互斥,而读者与读者之间没有互斥和同步的关系。因为读者写者模型,读者不会拿走临界区的资源,因此也就没有读者与读者之间的互斥关系。

读写锁适合的场景是一次写入,大部分时间都在只读并且不做修改。

读写锁的接口了解:

初始化

写者的加锁

 读者的加锁

 解锁

这里我们可以观察到,锁的接口的使用方法很多都是一样的,因此学习成本也比较低,只要学会了mutex锁的接口使用方法就OK了。

读写锁的原理

接下来通过伪代码来了解一下读写锁的工作原理。

读者优先

当读者和写者竞争时,读者优先,当读者的数量大于0,那么就把写者的锁拿走,不让写者进入临界区。当读者的数量为0,那么写者申请锁,可以进入。

读者的加锁:

添加锁:
    pthread_mutex_t rdlock;//锁的变量
    int reader_count = 0;//初始化,用于计数,读者的数量

	lock(&rdlock);//为读者加锁,保证线程安全
	reader_count++;//读者的数量加一
	if(reader_count==1) lock(&wrlock);//如果读者的数量为1,把写者的锁拿走,不让写者进来写了
	unlock(&rdlock);//读者解锁

	//读取数据
    //......

	lock(&rdlock);//加锁,保证线程安全
	reader_count--;
	if(reader_count==0) unlock(&wrlock);//当读者的数量为0,把写者的锁还回去
	unlock(&rdlock);

写者的加锁:

pthread_mutex_t wrlock;
lock(&rwlock);
//写入数据
//.....
unlock(&wrlock);

写者优先

写者优先很少用到。所谓的写者优先,是在临界区中读者的数量大于0,后面还有读者想要申请进入临界区,此时写者就会比他们优先。

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

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

相关文章

【经验分享】硬件工程师需要知道的DFM可制造性设计

最近,有硬件工程师朋友找我讨论DFM,也就是可制造性设计。Design for Manufacturability。 什么是可制造性设计,看一张图很容易明白: 过大的PCB,无法上产线批量生产,极大的PCB面积浪费,自然是失…

Spring Batch 指南

SpringBatch 介绍 目前,Spring Batch是批处理框架界为数不多的优秀框架(Java语言开发)。 Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。 Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,…

.Net 6.0 部署Linux+Nginx +PM2教程

今天带大家将本地.Net6.0项目部署到Linux系统中,其中有用到Nginx反向代理和PM2进程管理工具,希望本偏文章能对你有所帮助,成为你成功路上的垫脚石! 背景: 在.Net 5.0横空出世之后,.Net已经支持夸平台了,身为一名合格的码农,你敢说你不会用Linux? 哈哈哈开个玩笑,因为工作最近接…

Idea启动运行报错:Error:java: 无效的源发行版: 13

最近在做Springboot项目时,常常出现上述错误,小编也不知道怎么回事,到网上找了这个方面的解决办法,但是却发现根本解决不了,最终通过小编多次尝试,终于发现,为什么会报这个错误。(应该是Java版本…

基于广泛数据增强的新型白质束ONE-SHOT分割

文章目录 One-Shot Segmentation of Novel White Matter Tracts via Extensive Data Augmentation摘要方法One-Shot分割的广泛数据增强 实验结果 One-Shot Segmentation of Novel White Matter Tracts via Extensive Data Augmentation 摘要 探索了新WM束的One-Shot分割问题由…

Kubernetes 如何保障容器可用性?一文介绍探针的使用

有时候,应用因为无限循环或死锁而停止响应,为确保应用在这种情况下可以重新启动,需要有一种机制检查应用程序的运行状况,而不是依赖应用程序内部的检测。 K8s 主要提供了三种探针来针对这种机制: 存活探针&#xff1a…

Swift之深入解析内存安全

一、内存安全 一般来说,Swift 会阻止代码中的不安全行为。例如,Swift 会保证变量在被使用前已经初始化,在释放某变量后其内存也会变得不可访问,以及检查数组索引是否存在越界错误。Swift 还通过要求修改内存中位置的代码具有对该…

通达信缠论顶底分型选股公式(一笔优化版)

在前文《缠论底分型选股公式,处理了包含关系》中介绍了缠论底分型,并编写了选股公式。底分型条件比较容易满足,因此产生的信号比较多。有热心网友提出,可以用顶底分型构成一笔过滤信号。 缠论一笔的构成条件:两个相邻…

砷化镓,锑化铟的能带结构

目录 回顾 正课 1.锑化铟的能带结构 2.砷化镓的能带结构 3.混合晶体的能带结构 回顾 从结合力上看由共价键和离子键混合 化合物半导体从结构上来说具有闪锌矿结构 三五族半导体的能带结构: 1.导带结构 2.价带结构 3.禁带宽度 正课 能带结构的共同特征&#…

docker容器与网络模式|磁盘使用|内存使用|清理

docker容器与网络模式|磁盘使用|内存使用|清理 一 docker 网络模式二 docker的网络模式分类三 网络模式详解3.1host模式:3.2 container模式container模式操作 3.3 none模式3.4 brideg模式3.5 自定义网络 四 容器资源控制4.1 docker容器cpu压力测试4.2 设置CPU资源占…

SpringCloud 微服务随机掉线排查过程

一、背景 我们的业务共使用 11 台(阿里云)服务器,使用 SpringcloudAlibaba 构建微服务集群, 共计 60 个微服务, 全部注册在同一个 Nacos 集群。 流量转发路径:nginx -> spring-gateway -> 业务微服务。 使用的版本如下&a…

IGA_PLSM3D的理解1

文章目录 前言一、IgaTop3D_FAST.m给的参数二、Material properties 材料特性对Geom_Mod3D的理解 三、IGA准备对Pre_IGA3D的理解 输出1-----CtrPts: 输出2-----Ele: 输出3-----GauPts: 对Boun_Cond3D的理解 输出1-----DBoudary: 输…

Java入坑之类的派生与继承

一、继承 1.1继承的概念 Java中的继承:子类就是享有父类的属性和方法,并且还存在一定的属性和方法的扩展。 Subclass,从另一个类派生出的类,称为子类(派生类,扩展类等) Superclass,派生子类的类&#xff…

PC主流同步软件评测

因为一个要把超过13G的众多零散文件同步到webdav网盘的需求,将市面上一些知名的同步软件试用测试了一番,最终发现只有Syncovery满足需求 先把参与测试的同步软件列一下: GoodSync、FreeFileSync、微软SyncToy、KLS Backup、SecondCopy、Sma…

coreboot seabios

seabios现在是很多虚拟机的默认启动bios,这跟它的短小精干有很大关系,也跟它提供比较完备的legacy支持有关。 按照以下步骤把seabios制作成coreboot的payload, 下载seabios代码, http://code.coreboot.org/p/seabios/downloads…

学生成绩管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87700420 更多系统资源库…

【Cpython的GIL详细了解一下?】

简单解释 全局解释器锁(Global Interpreter Lock,简称 GIL)是 CPython 解释器内部的一个同步原语,它用于在同一时间只允许一个线程执行 Python 字节码。 GIL 的工作原理如下: 在 CPython 中,每个线程都需…

systemctl 命令设置开机自启动失败

1.案例现象 我在 3 月 31日的时候发表了一篇《shell 脚本之一键部署安装 Nginx 》,介绍了如何通过 shell 脚本一键安装 Nginx 我脚本中执行了 Nginx 开机自启动的命令,当我使用 systemctl status nginx 命令复核的时候,我发现 Nginx 服务设…

C# NetCore XML 反序列化解析错误:<xml xmlns=‘‘> was not expected 及 Encoding=utf-16问题

xml帮助类在最后 刚好有业务需要解析xml文件&#xff0c;于是找到帮助类代码开始尝试解析文件&#xff0c;总是出现异常&#xff1a;<xml xmlnsxxxxxxxxxxxxxxxx> was not expected&#xff0c;开始寻找解决方案&#xff1a; 要使结果正确&#xff0c;必须满足两个条件…

【Qt】QString与QChar的源码学习及二者与Unicode的关系【2023.04.20】

简介 关于QString乱码的一些补充。主要就两点&#xff0c;QChar、QString底层存储的字符都是16进制的Unicode编码。 QChar QChar对应16位的Unicode字符集。 The QChar class provides a 16-bit Unicode character. In Qt, Unicode characters are 16-bit entities without an…