当前位置: 首页 > news >正文

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

目录

读者写者模型

特殊锁

悲观锁

自旋锁


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

读者写者模型

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

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

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

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

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

1.以读者身份加锁。

2.以写者身份加锁。

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

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

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

特殊锁

悲观锁

何为悲观锁?

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

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

自旋锁

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

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

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

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

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

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

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

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

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

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

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

相关文章:

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

目录 读者写者模型 特殊锁 悲观锁 自旋锁 在前几期,我们学习了多线程的生产者和消费者模型,生产者和消费者模型中,有三种关系,两个角色,一个场所,那么读者写者模型和生产者消费者模型有什么关联吗&…...

回溯专题 记录

回溯的题目按照这套模板进行&#xff1b; 我感觉整体逻辑还是递归&#xff0c;只不过有了pop_back才是回溯概念&#xff1b; class Solution {public:vector<int> path;vector<vector<int>> ans;void backtracking(int n,int k,int startindex){if(path.…...

使用 Python 实现自动化办公(邮件、Excel)

目录 一、Python 自动化办公的准备工作 1.1 安装必要的库 1.2 设置邮件服务 二、邮件自动化处理 2.1 发送邮件 示例代码 注意事项 2.2 接收和读取邮件 示例代码 三、Excel 自动化处理 3.1 读取和写入 Excel 文件 示例代码 3.2 数据处理和分析 示例代码 四、综合…...

贪心算法笔记

贪心算法笔记 大概内容 贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种 看时间复杂度,一般的就是 O ( n…...

Formality:两种等价状态consistency和equality

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 背景 逻辑锥的等价性检查时&#xff0c;存在两种验证模式&#xff1a;一致(consistency)和等同(equality)&#xff0c;要理解这两点&#xff0c;首先得明白综合工具…...

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…...

第30章 汇编语言--- 性能优化技巧

汇编语言是用于直接编程计算机硬件的低级语言&#xff0c;它几乎是一对一地映射到机器指令。因为汇编代码与特定处理器架构紧密相关&#xff0c;所以在讨论性能优化技巧时&#xff0c;通常需要考虑具体的CPU架构和指令集。 以下是一些通用的汇编语言性能优化技巧&#xff0c;并…...

HTB:Paper[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 对靶机进行子域…...

数据库中的 DDL、DML 和 DCL

数据库中的 DDL、DML 和 DCL 在数据库的定义与操作中&#xff0c;DDL、DML 和 DCL 是三个核心概念&#xff0c;分别用于不同层面的数据库管理与操作。 1. DDL&#xff08;Data Definition Language&#xff09; - 数据定义语言 定义 DDL 用于定义和管理数据库的结构或模式。…...

OKR 极简史及理解

大家读完觉得有帮助记得点赞和关注&#xff01;&#xff01;&#xff01; 目录 MBO SMART 和 KPI OKR 1. 什么是 OKR&#xff1f; 1.1 Objectives&#xff08;目标&#xff09; 1.2 Key Results&#xff08;关键成果&#xff09; KR 应当是困难的&#xff0c;但并非不可…...

电商项目-基于ElasticSearch实现商品搜索功能(四)

一、 高亮显示 1.1 高亮分析 高亮显示是指根据商品关键字搜索商品的时候&#xff0c;显示的页面对关键字给定了特殊样式&#xff0c;让它显示更加突出&#xff0c;如商品搜索中&#xff0c;关键字变成了红色&#xff0c;其实就是给定了红色样式。 1.2 高亮搜索实现步骤解析 …...

TCP封装数据帧

void *send_data(void *arg) //这是一个发送数据的线程 {int sockfd init_tcp_cli("192.168.0.148",50000) //传ip和port&#xff0c;port 50000是因为大概前五万都被其它服务所占用&#xff0c;50000后是私人ipif(sockfd < 0){return NULL;}unsigned char …...

数据结构与算法之二叉树: LeetCode 515. 在每个树行中找最大值 (Ts版)

在每个树行中找最大值 https://leetcode.cn/problems/find-largest-value-in-each-tree-row/description/ 描述 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值 示例1 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2 输入: root [1,2,3]…...

百度视频搜索架构演进

导读 随着信息技术的迅猛发展&#xff0c;搜索引擎作为人们获取信息的主要途径&#xff0c;其背后的技术架构也在不断演进。本文详细阐述了近年来视频搜索排序框架的重大变革&#xff0c;特别是在大模型技术需求驱动下&#xff0c;如何从传统的多阶段级联框架逐步演变为更加高…...

构造函数的原型原型链

代码示例 // 定义一个构造函数 Test function Test() {this.name 张三 }; //向构造函数的原型添加一个属性 age18 Test.prototype.age 18;//使用构造函数 Test 来实例化一个新对象 const test new Test();//向 Object.prototype 添加了一个名为 sex 的属性&#xff0c;其值…...

nginx反向代理及负载均衡

华子目录 nginx反向代理功能http反向代理反向代理配置参数proxy_pass的注意事项案例&#xff1a;反向代理单台后端服务器案例&#xff1a;反向代理实现动静分离案例&#xff1a;反向代理的缓存功能非缓存场景下测压准备缓存缓存场景下测压验证缓存文件 反向代理负载均衡&#x…...

单片机实物成品-011 火灾监测

火灾监测&#xff08;20个版本&#xff09; 版本20&#xff1a; oled显示温湿度烟雾浓度火焰传感器天然气浓度窗户风扇水泵排气系统声光报警语音播报按键WIFI模块 ----------------------------------------------------------------------------- https://www.bilibili.com…...

使用 Docker 在 Alpine Linux 下部署 Caddy 服务器

简介 在现代 web 开发中&#xff0c;选择合适的 web 服务器至关重要。Caddy 是一个功能强大的现代化 HTTP/2 服务器&#xff0c;支持自动 HTTPS&#xff0c;配置简单&#xff0c;适合开发和生产环境。Docker 则为我们提供了一种轻量级的容器化技术&#xff0c;使得应用程序的部…...

每日十题八股-2025年1月12日

1.为什么四次挥手之后要等2MSL? 2.服务端出现大量的timewait有哪些原因? 3.TCP和UDP区别是什么&#xff1f; 4.TCP为什么可靠传输 5.怎么用udp实现http&#xff1f; 6.tcp粘包怎么解决&#xff1f; 7.TCP的拥塞控制介绍一下&#xff1f; 8.描述一下打开百度首页后发生的网络过…...

Python中定位包含特定文本信息的元素

目录 一、为什么需要定位包含文本信息的元素 二、使用Selenium定位包含文本的元素 1. 使用find_element_by_link_text 2. 使用find_element_by_partial_link_text 3. 使用XPath定位包含文本的元素 4. 使用CSS选择器定位包含文本的元素 三、使用BeautifulSoup定位包含文本…...

uniapp实现H5页面内容居中与两边留白,打造类似微信公众号阅读体验

在 UniApp 中&#xff0c;由于需要兼容多端应用&#xff0c;我们通常使用 rpx 作为尺寸单位。然而&#xff0c;在某些情况下&#xff0c;如需要实现内容居中且两边留白时&#xff0c;直接使用 rpx 可能会带来一些限制。这时&#xff0c;我们可以考虑使用 px 或 rem 等单位&…...

极品飞车6里的赛道简介

极品飞车里有很多赛道,赛道分为前向赛道Forward、后向赛道Backward。前向赛道Forward是从A点到B点;后向赛道Backward是前向赛道的逆过程,即从B点到A点。这里介绍极品飞车6的赛道长度、中英文名称翻译、难度等级。 序号赛道英文名赛道中文名总长(km)急弯难度等级1Alpine Trai…...

SAP推出云端ERP解决方案,加速零售行业数字化转型

2025年1月9日&#xff0c;SAP发布了一款专为零售行业设计的云端ERP行业解决方案——S/4HANA Cloud Public Edition&#xff0c;进一步推动企业向云端迁移。这款解决方案旨在集中运营数据&#xff0c;整合财务、采购和商品管理流程&#xff0c;以帮助零售企业优化运营效率。 核…...

Python爬虫进阶——案例:模拟bilibili登录)

主要内容&#xff1a;模拟bilibili账号密码登录&#xff0c;不要实现的的实现功能是单击登录按钮&#xff0c;切换登录方式&#xff0c; 输入账号和密码&#xff0c;然后完成图片点击验证&#xff0c;最后单击立即登录按钮。 1、第一步&#xff1a;通过selenium模块访问bilibi…...

什么是数据分析?

什么是数据分析&#xff1f; 数据分析&#xff08;Data Analysis&#xff09;是指通过对数据进行收集、整理、处理、建模和解读&#xff0c;以揭示数据中的有用信息、支持决策和解决实际问题的过程。它是一门将数据转化为知识的学科&#xff0c;广泛应用于商业、科学研究、医疗…...

基于springboot的课程作业管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的课程作业管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 可以管理首页、个人中心…...

多线程之旅:属性及其基本操作

上次分享到了&#xff0c;多线程中是是如何创建的&#xff0c;那么接下来&#xff0c;小编继续分享下多线程的相关知识。 多线程中的一些基本属性。 基本属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDemo()是否存活isAlive()是…...

数据表中的数据插入、更新和删除

文章目录 一、表的插入二、更新表中的数据记录三、删除表中的数据记录 一、表的插入 插入数据记录是常见的数据操作&#xff0c;可以显示向表中增加的新的数据记录。在MySQL中可以通过“INSERT INTO”语句来实现插入数据记录&#xff0c;该SQL语句可以通过如下4种方式使用&…...

Q_OBJECT宏报错的问题

在Qt中继承QObject&#xff0c;并且加上Q_OBJECT宏&#xff0c;有时候会报错&#xff0c;比如我的错误&#xff1a; error: debug/httpmgr.o:httpmgr.cpp:(.rdata$.refptr._ZTV7HttpMgr[.refptr._ZTV7HttpMgr]0x0): undefined reference to vtable for HttpMgr 意思是没有虚…...

提升性能300ms:深入解析Spring多表联接查询优化与SQL调优实战

优化所需知识点&#xff08;必须掌握&#xff09; 索引篇 explain命令 重点&#xff1a;这是后续分析是否使用索引以及使用是否恰当的工具 作用&#xff1a;查看sql的执行计划&#xff0c;可以看sql语句是否使用了索引&#xff0c;索引的使用情况&#xff0c;以及sql的性能。 …...

哪个网站可以免费做网页/软文推广策划方案

时间日期处理类&#xff08;Date类&#xff0c;Calendat类&#xff09; 在Java中获取当前时间&#xff0c;可以使用java.util.Date类和java.util.Calendar类完成。其中&#xff0c;Date类主要封装了系统的日期和时间的信息&#xff0c;Calendar类则会根据系统的日历来解释Date…...

个人网站页脚设计/网站服务器软件

linux centos7 默认防火墙是关闭的&#xff0c;设置了开启端口后一定要重启防火墙&#xff0c;否则端口开启会不起作用 查看已开启的端口 firewall-cmd --list-ports 查看防火墙状态 firewall-cmd --state 开启防火墙 systemctl start firewalld 开启端口 firewall-cmd…...

做网站销售药品/seo短视频网页入口引流免费

四次挥手的流程 1、主动关闭方发送FIN连接释放报文段 客户端调用 close 方法&#xff0c;告诉服务器自己要主动关闭连接&#xff0c;会发送一个 FIN 报文给服务端&#xff0c;客户端进入FIN-WAIT-1状态。 2、被动关闭方发送对FIN的ACK普通确认报文段 由于此时服务器数据很可能…...

建设网站怎样做/网站设计的毕业论文

2019独角兽企业重金招聘Python工程师标准>>> 安装node.js npm config set registry http://r.cnpmjs.org 转载于:https://my.oschina.net/u/2370328/blog/692258...

深圳物流公司联系电话/百度上如何做优化网站

JavaScrip 排序算法&#xff08;JavaScript Sorting Algorithms&#xff09; 基础构造函数 以下几种排序算法做为方法放在构造函数里。 function ArrayList () {var array [];// 交换位置var swap function (index1, index2) {var aux array[index1];array[index1] array[i…...

给公司做网站怎么样/超级外链发布

转自&#xff1a;Rayomcnblogs.com/Rayom/p/13967415.html简介.Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库&#xff0c;用于序列化和反序列化Json&#xff0c;此库的设计是为了取代Json.Net(Newtonsoft.Json)时间格式化的不足System.Text.Json的优点就不…...