Linux基础内容(29)—— 额外锁

news2024/11/16 11:30:57

Linux基础内容(28)—— POSIX信号量与循环队列_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131844590?spm=1001.2014.3001.5501

目录

1.其他常见的各种锁

自旋锁

库语言的实现

2.读者写者问题

1.读者写者线程

2.读写锁

操作

优先级

伪代码实现


1.其他常见的各种锁

悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。
乐观锁:每次取数据时候,总是乐观的认为数据不会被其他线程修改,因此不上锁。但是在更新数据前,会判断其他数据在更新前有没有对数据进行修改。主要采用两种方式:版本号机制和CAS操作。
CAS操作:当需要更新数据时,判断当前内存值和之前取得的值是否相等。如果相等则用新值更新。若不等则失败,失败则重试,一般是一个自旋的过程,即不断重试。

自旋锁

1.我们之前说的锁,被拿取后,其他的线程接收不到锁需要被挂起。而自旋锁是不断地判断是否有锁。

2.无论是普通锁还是自旋锁,都需要考虑场景,目前最大的区分其实是时间效率的事情。所谓的自选就是在不断的循环判断,就意味着线程不挂起,空间被占用,并且不断检查则说明此时多次检查也耗费时间

3.线程如果执行的任务很少,并且达到我们预计需要的时间效益则选择自旋锁。当然判断的标准就是看这两者在实际的项目中run的时间。

库语言的实现

2.读者写者问题

1.读者写者线程

1.在计算机中,其实大部分都在进行复制拷贝的任务。那么其实对于线程也不例外,有两种线程分担了读写的任务。而这两个角色对应的就是读者和写者

2.读者与写者的关系:读者读取时,写者不可以进行操作,避免读取数据被修改;写者写入时,读者也不能干预,避免数据的重复等错误的发生。读者需要写者写入才能读取;写者得有读者读取后释放的空间进行写入。那么由此可知读者和写者的关系为同步互斥

3.写者和写者之间的关系:一次只可以有一个线程对公共资源进行写入,避免出现数据异常的问题。那么也就是说写者之间的关系为 互斥的。

4.读者和读者之间的关系:一个读者读取任务时,另一个读者似乎不会受到什么干扰,那么也就是说二者其实怎么运行是不会有影响的,读者之间的关系是无关系

5.区别于生产消费者模型下的消费者之间的关系存在很大的差异,消费者之间是互斥的,而读者之间是无关系的。这本质其实是因为消费者在处理公共资源后,会讲公共资源的数据拿走,进行运行处理;而读者不同,读者只是拷贝了一份,没有对数据进行改动。这也就是为什么二者差异的原因了。

2.读写锁

操作

读写锁其实针对读者和写者各一把锁,保证二者的关系。

//初始化
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t*restrict attr);

//销毁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

//加锁和解锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

优先级

int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref);
/*
    pref 共有 3 种选择
    PTHREAD_RWLOCK_PREFER_READER_NP (默认设置) 读者优先,可能会导致写者饥饿情况
    PTHREAD_RWLOCK_PREFER_WRITER_NP 写者优先,目前有 BUG,导致表现行为和
    PTHREAD_RWLOCK_PREFER_READER_NP 一致
    PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 写者优先,但写者不能递归加锁
*/

1.读写锁一般默认是读者优先,读者优先说明写者会被强制不允许,也就会出现写者饥饿情况。就是当写者和读者同时运行,那么读者先进入,对数据进行复制

2.当然也可以选择写者优先。不过其顺序是,当前读者有不断进入的,如果碰到写者需要运行,那么当前进入的读者线程先进入完毕,随后写者线程被挂起,优先执行也就进入的读者的读取事件;当全部进入的读者读取完毕,写者再拿取锁,进行写入,期间读者线程被挂起等待。

伪代码实现

定义锁有读者锁rdlock,写者锁wdlock;

读者加锁操作:

pthread_mutex_t rdlock;
int reader_count = 0;

lock(&rdlock);
reader_count++;
if(reader_count==1) lock(&wrlock);
unlock(&rdlock);

//数据读取

lock(&rdlock);
reader_count--;
if(reader_count==0) unlock(&wrlock);
unlock(&rdlock);

1.定义计数器,用于计入有多少读者当前在进行读取数据

2.读取计数前先对读者锁进行上锁,为了达到对计数器的线程安全;此外当reader_count==1,说明此时的一定有读者将来要进行读取数据,那么我们就不允许写者进入访问,所以对写者锁上锁

3.最后读取成功后,需要对读者锁进行上锁,随后减去计数器中读者的个数

写者加锁操作:

lock(&wrlock);

//写者写入

unlock(&wrlock);

相对的写者就简单了不少,直接加锁即可。这样的实现其实就是默认的读者优先。

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

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

相关文章

SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...

写了一个基本的SpringMVC程序进行测试,结果启动时一直显示在等待部署完毕,,, but这个地方一直显示转圈圈。。 后来通过url访问时网页一直转圈圈。。也就是等待响应。。 看了一会儿,也不知道哪儿错了,&…

什么是多运行时架构?

服务化演进中的问题 自从数年前微服务的概念被提出,到现在基本成了技术架构的标配。微服务的场景下衍生出了对分布式能力的大量需求:各服务之间需要相互协作和通信,以及共享状态等等,因此就有了各种中间件来为业务服务提供这种分…

紫光FPGA试用--软件篇

目录 一 软件安装启动 二 如何打开IP核?查看/修改现有IP核参数? 三 如何定义引脚? 四 如何下载code进入FPGA? 1. 下载到FPGA芯片内: 2.下载到外部FLASH中 五 如何进入在线调试模式,调试步骤 操作步骤&#xff…

微分流形之魂

找到一个非常棒的教程:本科生自学微分流形有哪些资料推荐? - 知乎 应该是目前微积分的终极答案了(非数学系) 首先,这个函数具有线性结构。所以他是属于V*的。 之前我倒没想过这个问题,以为所有的泛函都是V…

4个公式8个案例学会与AI GPT对话

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. chatgpt体验:http://www.chat136.com chatgpt学习&#xff1a…

【OJ比赛日历】快周末了,不来一场比赛吗? #07.29-08.04 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-07-29(周六) #8场比赛2023-07-30…

一文带你迅速入门SprIngMVC,看这一篇就足够了!

0. 什么是SpringMVC 要知道什么是SpringMVC,我们首先得知道什么 MVC,MVC是软件工程中的一种架构模式,分为 Model、View、Control。它把软件系统分为模型、视图和控制器三个基本部分。 Model:模型,应用程序负责数据逻…

SVN - 记录一下无法提交代码 提示:被锁定(locked)

今天遇到一个问题,svn 在提交代码的时候出现了svn is already locked,导致代码无法提交(commit)和更新(update) 主要报错如下: 解决方法: 然后点击 Clean up 选中一下选项&#xff…

人工智能巨头碰撞——埃隆·马斯克推出xAI挑战OpenAI的统治地位

目录 前言XAI 的推出什么是XAI?它将聚焦于什么? 一:“反AI斗士”马斯克进军AI,你怎么看?二:回顾上半年的“百模大战”,中国的AI产业怎么样了?三:AI大模型这把火&#xff…

算法通过村第二关-链表白银笔记

文章目录 再战链表|反转链表剑指 Offer II 024. 反转链表熟练掌握这两种解法建立头节点的解决思路不采用建立头节点的方法采用循环/递归的方式解决 总结 再战链表|反转链表 提示:多拿些酒来,因为生命只有乌有。 剑指 Offer II 024. 反转链表 如果不使用…

9个可用于图片转文本的最佳免费 OCR 软件

光学字符识别 (OCR) 软件可帮助将不可编辑的文档格式(例如 PDF、图像或纸质文档)转换为可编辑和可搜索的机器可读格式。 OCR 应用程序通常用于从 PDF 和图像中捕获文本,并将文本转换为可编辑格式,例如 Word、Excel 或纯文本文件。…

SpringBoot复习:(3)应用打包成jar包,清单文件里的主类是我们用@SpringBootApplication注解标记的类吗?

不是. MANIFEST.MF类似如下: Manifest-Version: 1.0 Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Spring-Boot-Layers-Index: BOOT-INF/layers.idx Start-Class: com.example.demo.DemoApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-…

DevOps-GitHub/GitLab

DevOps-GitHub/GitLab GitHub是一个开源代码托管平台。基于web的Git仓库,提供共有仓库和私有仓库(私有仓库收费)。 GitLab可以创建免费私有仓库。 GitHub 为了快速操作,这里对创建仓库以及注册不做说明。 首先再GitHub上创建一…

不用手动编程!ChatGPT帮你轻松实现单片机按键输入功能

从今年年初,OpenAI发布的ChatGPT已摧古拉朽之势席卷全球,短短两个月注册用户数就超过1亿人,是全世界增长速度最快的应用。很多人都说今年是AI元年,其实也是有一定道理的,之前的AI门槛相对较高,很多人没有机…

python使用CGI编程,网页写个标题

需要有个 Linux虚拟机,安装 apache, 本次使用 deepin v23,参考: sudo apt install apache2 #安装 apache2 systemctl start apache2 # 启动 apache2 sudo a2enmod cgi # 启用CGI模块 sudo mkdir /usr/lib/cgi-bin #创…

APT32组织针对我国关基单位攻击活动分析

事件背景 2022年5月,绿盟科技伏影实验室与运营能力中心梅花K战队共同于国家某关基单位发现异常外联IP,通过攻击活动中捕获的攻击流量分析,确认此次攻击活动是由境外APT组织APT32所发起。 绿盟科技伏影实验室与运营能力中心梅花K战队利用主机…

2 种方式查找极狐GitLab 容器镜像 Tag,几分钟快速构建私有化部署实例

目录 通过 Helm 命令查找 第1步:添加 Helm Chart 第2步:更新 Helm Chart 第3步:Helm search 查找过往 tag 通过 Omnibus package 来查 极狐GitLab 是一个一体化 DevOps 平台,其灵活的私有化部署方式(源代码安装、…

通识测试09缺陷和缺陷报告

缺陷和缺陷报告 缺陷的基本概述 缺陷的定义 缺陷的属性 正向的测试用例缺陷远高于反向的。 缺陷的类型 缺陷的生命周期 缺陷的识别 缺陷报告 缺陷报告 缺陷报告编写目的 需求、用例、bug的关系

Android触摸事件分发机制(一)

1. 简介 本文主要分享事件分发中的基本概念。 介绍负责参与分发事件的主要方法。 从这些方法的核心逻辑中,总结事件分发的规律。 2. 被分发的对象 被分发的对象是那些?被分发的对象是用户触摸屏幕而产生的点击事件,事件主要包括&#xff1…

人脸检测实战-insightface

目录 简介 一、InsightFace介绍 二、安装 三、快速体验 四、代码实战 1、人脸检测 2、人脸识别 五、代码及示例图片链接 简介 目前github有非常多的人脸识别开源项目,下面列出几个常用的开源项目: 1、deepface 2、CompreFace 3、face_recogn…