Linux之读者写者模型与特殊锁的学习

news2025/1/13 7:43:27

目录

读者写者模型

特殊锁

悲观锁

自旋锁


在前几期,我们学习了多线程的生产者和消费者模型,生产者和消费者模型中,有三种关系,两个角色,一个场所,那么读者写者模型和生产者消费者模型有什么关联吗?以此问题,展开本期内容的学习。

读者写者模型

通过一个现实生活中的场景为大家引入读者和写者模型。

小时候,我们上学的时候,每周或者说每学期都会写黑板报,有的同学负责写,有的同学负责读,当有同学在进行写时,其他同学不能写,且其他同学不能读(这里的不能读指的是当写的学生没有写完时,因为没有写完黑板报内容不全),一个同学在读黑板报时,其他同学也可以去读,也可以等这个同学读完之后再去读。

基于以上场景,我们不难发现,读者和写者模型,有1个场所(黑板),两个角色(写者和读者),三种关系(指的是两个角色所构成的关系),读者和读者没有关系,写者和写者是互斥关系,写者和读者是互斥和同步关系。

综上,读者和写者模型图示如下。

读者写者模型相关接口如下。

1.以读者身份加锁。

2.以写者身份加锁。

3.互斥锁的初始化和销毁。

4.读者锁和写者锁的解锁。读者和写者锁的解锁接口统一使用这个接口 。

读者和写者模型伪代码如下。具体实现代码我们不予实现,读者写者内容我们了解即可。

特殊锁

悲观锁

何为悲观锁?

悲观锁我们又称之为挂起等待锁。在多线程场景中往往只有一个锁资源,且当这个锁资源被一个线程获取之后并进行加锁访问临界资源时,其它线程是不能再次进行加锁的,只能被阻塞挂起在阻塞队列中,所以我们称之为悲观锁,也称作挂起等待锁。

在前几期学习的互斥锁的学习中,互斥锁就是一个悲观锁。

自旋锁

自旋锁我们通过一个现实生活中的场景。

场景一:小明和小张准备出去玩,小明已经准备好了,所以提前来到了小张家楼下,打电话问小张是否准备好,小张说还得一个小时,此时小明不继续在小张家楼下去等,而是去了附近的网吧打了一小时游戏,打了一小时游戏之后才去打电话问小张是否准备好,小张也已经准备好了,所以和小张一起出去玩了。

场景二:第二天,小明又准备和小张出去玩,小明也和昨天一样提前准备好来到了小张家楼下,当小明打电话时,小张说还得一分钟,所以此时小明就没有去网吧,而是在楼下等了一分钟,一分钟之内可能由于小张有点磨叽,所以导致小明多次给小张打电话,最终小明和小张一起出去去了外面玩。

上述两种场景,我们发现唯一的区别就是,小明在小张楼下等待的时间的长短以及在等待过程中给小张打电话的间隔。

悲观锁类似于场景一,即得不到锁资源加锁时,挂起在阻塞队列中,不断地去轮询检测锁资源是否准备好,但是这个轮训时间是很长的。自旋锁就类似于场景二,得不到锁资源加锁时,在阻塞等待队列中等待锁资源,但轮询检测的时间间隔是很短的。

基于此,那么悲观锁和自旋锁就有了自身的使用场景。

我们知道,当多线程访问临界资源时,我们一般要对临界资源进行加锁,当线程访问临界资源比较慢时,我们推荐使用悲观锁,当访问临界资源比较快时,我们使用自旋锁

那么问题来了,当线程访问临界资源时,线程怎么知道自己访问临界资源是否快慢呢?
线程当然不知道,但是我们程序员自然知道,因为临界区的代码是我们程序员写的,所以锁的使用,就需要我们程序员自己去合理的分配。

这便是特殊锁中的悲观锁和自旋锁所有内容。

以上便是本期的所有内容^_^

至此,Linux操作系统篇全部结束,后续将展开Linux网络编程的学习。

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

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

相关文章

期刊(中英),期刊分区,期刊所在数据库(中英),出版商区别和联系

目录 对期刊、分区、数据库、出版商整体了解期刊(中英)期刊分区期刊所在数据库总结 出版商 对期刊、分区、数据库、出版商整体了解 下图是我对这四部分的一个理解,其中期刊根据论文使用语言分为中英两种,期刊分区是用来评判论文质…

数学函数的参数和返回值探秘

数学函数的参数和返回值探秘 一、数学函数的参数1.1 隐式类型转换1.2 隐式类型转换的秘密 二、数学函数的返回值 本文所说的数学函数单指<math.h>中的系统函数&#xff0c;这些函数对参数和返回值的要求与其他类函数是有一点不同的。尤其是参数部分&#xff0c;是有值得深…

炸砖块游戏的最终图案

描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…

代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -

一、24. 两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 视频&#xff1a;帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 讲解&#xff1a;代码随想录 dummy-…

【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解

分布式系统理论&#xff1a;CAP 与 BASE 详解 一、CAP 定理 背景与定义&#xff1a;1998 年由加州大学科学家埃里克布鲁尔提出&#xff0c;分布式系统存在一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&#xff08;Part…

【网络】:网络编程套接字

目录 源IP地址和目的IP地址 源MAC地址和目的MAC地址 源端口号和目的端口号 端口号 VS 进程ID TCP协议和UDP协议 网络字节序 字符串IP和整数IP相互转换 查看当前网络的状态 socket编程接口 socket常见API 创建套接字 绑定端口号 发送数据 接收数据 sockaddr结构…

UnityDemo-TheBrave-制作笔记

这是我跟着b站up主MStudio的视频学习制作的&#xff0c;大体上没有去做一些更新的东西&#xff0c;这里只是一个总的总结。在文章的最后&#xff0c;我会放上可以游玩该游戏的链接和exe可执行文件&#xff0c;不过没有对游戏内容进行什么加工&#xff0c;只有基本的功能实现罢了…

力扣经典二分题:4. 寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是&#xff1a;int m nums1.size(),n nums2.size();中位数性质1&#xff1a;中位数左侧元素 …

C++ 文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

SpringBoot:SaToken的options预检请求鉴权失败

问题描述 使用如下sa-token配置&#xff0c;前端通过IP端口号的方式访问后端服务&#xff0c;会存在options预检请求鉴权失败的问题。 问题分析 http-options请求 HTTP OPTIONS 方法请求给定的 URL 或服务器的允许通信选项。客户端可以用这个方法指定一个 URL&#xff0c;或者…

UE材质函数

材质函数是可在不同材质中重复使用的材质表达式的一个集合 相当于把常用的功能封装到一个集合里&#xff0c;需要用到的时候调用 输入input可以添加输入节点 如果勾上公开到库&#xff0c;就可以在材质面板直接搜索到材质函数 材质函数可以直接做成一个输出

51c~Pytorch~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/13059544 一、PyTorch DDP 正在郁闷呢 jetson nx 的torchvision安装~~ 自带就剩5g 想弄到ssd 项目中的 venv中又 cuda.h没有... 明明已经装好什么都对 算了说今天主题 啊对 还是搬运啊 学习之工具人而已 勿怪 Distrib…

用vscode写latex-1

一般大伙使用 LaTeX 大体有两种方案&#xff0c; 一种是在本地配置环境或使用本地的软件&#xff0c;如 vscode LaTeX&#xff0c;texlive&#xff0c;lyx 等等&#xff1b; 另一种是线上 LaTeX 平台&#xff0c;其中用的最多的是 Overleaf&#xff0c;还有一部分高校也有自…

用户界面软件05

已知应用 几乎所有的流行的用户界面架构都使用这种模式。我在这里举三个例子&#xff1a; 1. Seeheim 用户界面架构的特点是有一个应用核心的领域层和一个用户界面层。后者 被分为两层&#xff0c;叫做表示层和对话控制层。因为这个架构和面向事务系统有渊源&#xff0c;没有…

虚拟文件系统 VFS

目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口&#xff1a; VFS定义了一组标准的文件操作API&#xff0c;如open(), read(), write(), close()等&#xff0c;使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…

conda 批量安装requirements.txt文件

通常可以用下面conda命令安装requirements.txt文件 conda install --yes --file requirements.txt 但是&#xff0c;一旦遇到某个包安装失败&#xff0c;就会停止安装后续的包。 下面这条命令能解决上面出现的不执行后续包的问题&#xff0c;需要在CMD窗口执行&#xff1a; 点…

Auto-CoT:自动构建大模型的思维链提示

今天分享的是由上海交通大学发表的一篇文章&#xff1a;Auto-COT 论文题目&#xff1a;AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS 论文链接&#xff1a;https://arxiv.org/pdf/2210.03493 代码地址&#xff1a;https://github.com/amazon-science/aut…

算法练习7——拦截导弹的系统数量求解

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 假设某天雷达捕捉到敌国的导弹来袭。由于该系统还在试用…

命令行中打印二维码

前公司中登录设备时&#xff0c;需要下发密钥&#xff0c;密钥是通过扫描终端中的二维码获得的&#xff0c;终端中的二维码类似这样&#xff1a; 当时没理解原理&#xff0c;现在研究了下如何在命令行中打印二维码。主要介绍其中一些开源工具&#xff1a; 1. qrencode 简介 …

Android车机DIY开发之软件篇(八)单独编译

Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成&#xff0c;.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …