Linux多线程互斥量与原理剖析

news2024/11/17 18:24:51

这里我们简要介绍了线程间互斥相关的概念,并对加锁的一种原理进行了剖析,本人目前理解尚浅,若文中有表述不当的地方还望理解并指正,谢谢大家!

文章目录

  • 一:线程间互斥相关背景概念
  • 二:互斥量mutex
  • 三:互斥量实现原理探究

一:线程间互斥相关背景概念

  • 临界资源:多个线程执行流共享的资源叫做临界资源。
  • 临界区:每个线程内部,访问临界资源的代码,叫做临界区。
  • 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。
  • 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成了,要么没完成。

二:互斥量mutex

  • 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获取这种变量。
  • 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。
  • 多个线程并发的操作共享变量,回应发线程安全问题。

要解决上述因多线程操作共享变量带来的线程安全问题,需要做到以下三点

  1. 代码必须要有互斥行为:当代码进入临界区执行时,不允许其他线程进入该临界区。
  2. 如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只允许一个线程进入该临界区。
  3. 如果线程不在临界区中执行,那么该线程不能阻止其他线程进入临界区。

要做到上述三点,本质就是需要一把锁。Linux上提供的这把锁叫互斥量。
在这里插入图片描述
互斥量的接口:
(1)初始化互斥量:
方法一:静态分配

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

方法二:动态分配

int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* restrict attr);
参数:
mutex:要初始化的互斥量
attr:NULL

(2)销毁互斥量
销毁互斥量需要满足:

  • 使用PTHREAD_MUTEX_INITIALIZER初始化的互斥量不需要销毁
  • 不要销毁一个已经加锁的互斥量
  • 已经销毁的互斥量,要确保后面不会再有线程尝试加锁。

int pthread_mutex_destroy(pthread_mutex_t* mutex);

(3)互斥量加锁和解锁

int pthread_mutex_lock(pthread_mutex_t* mutex);
int pthread_mutex_unlock(pthread_mutex_t* mutex);
返回值:成功返回0,失败返回错误号

调用pthread_mutex_lock时,可能遇到以下情况:

  • 互斥量处于未锁状态,该函数会将互斥量锁定,同时返回成功。
  • 发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有竞争到互斥量,那么pthread_mutex_lock调用会陷入阻塞(执行流被挂起),等待互斥量解锁。

三:互斥量实现原理探究

  • 在多线程中,不难意识到单纯的i++或者++i都不是原子操作,原因是经过汇编后由多条语句构成,又因为线程在任何时刻都可能被切换,所以有可能会导致数据不一致问题。
  • 为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据做交换;由于只有一条语句,所以保证了原子性

线程加锁是如何保证原子性的?下面我们看lock的一段伪代码:
在这里插入图片描述
%al:寄存器;
mutex:内存中的一个变量
凡是在寄存器中的数据,全部都是线程的上下文数据,在线程被切换时,会随着线程一起离开。

💡💡💡由上述伪代码,上锁的过程分为三步:

  1. 将0写入寄存器,mutex值默认为1。
  2. 交换寄存器和mutex的值。
  3. 判断寄存器中的内容,如果大于0,则加锁成功,否则线程挂起等待!
    在这里插入图片描述
    在这里插入图片描述

如果在判断之前,线程A被切换走了,此时线程A带着寄存器上下文数据(1)一起被切换走,那么此时来的线程因申请不到锁而被挂起等待。

加锁的结果就是把线程访问临界区串行化!

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

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

相关文章

摄影测量学:期末考试重点总结

本文参考《摄影测量学》 (王佩军,徐亚明 编著); 01 不同阶段的摄影测量的对比,课本表1-1 (原始资料、投影方式、仪器记不住,那名字总该记住吧?模拟摄影测量、解析摄影测量、数字摄影测量) 02 量…

Python中的所有运算符以及运算符的优先级

文章目录前言一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、位运算符六、运算符的优先级案例实战总结前言 运算符是一些人为定义的特殊符号,比如我们生活当中最常见的 、-、、,它们主要用于数学计算、比较大小和逻辑运算等等。那这些运…

数字孪生医院的智能化运营平台建设内容

随着国务院办公厅《关于推动公立医院高质量发展的意见》印发,高质量发展已成为医院发展的主旋律。当前市场经济正处于增长速度换挡期,医院面临着转型发展的紧迫性,运 用新一代信息技术促进医院管理体系与管理能力现代化发展势在必行。基于数字…

读论文---DETR

DETR 深度学习之目标检测(十一)--DETR详解_木卯_THU的博客-CSDN博客_detr 下面内容取材自上述博客和唐宇迪视频

20221229英语学习

今日新词 premier adj.首要的, 最著名的, 最成功的, 第一的 microscopic adj.极小的;需用显微镜观察的;使用显微镜的 complaint n.抱怨;埋怨;投诉;控告 moth n.蛾 prototype n.原型,雏形 tournament …

面试官:自动化测试都没弄明白,你怎么敢来面试 “ 软件测试开发 ” 的?

面试一直都是一个热门话题,测试员当然也逃不过~纵使你是一个技能全部满点的超优秀测试员,卡在面试这一关也是万万不可的。特别是大厂的测试员,他们面试所问的东西,你在学校通常接触不道,所以没有哪个应届生是一毕业啥也…

关于Nginx 用户认证、SSL证书生成配置的一些笔记

写在前面 分享一些 Nginx 用户认证、SSL 加密配置的笔记博文内容涉及 Nginx 用户认证、SSL 加密配置 Demo通过 OpenSSL 生成使用 SSL 证书、私钥和 CSR Demo 理解不足小伙伴帮忙指正 这世界的一面至始至终是表象,正如另一面至始至终是意志 -----《作为意志和表象的世…

涨价都涨疯了

大家好,我是校长。给大家推荐个好东西,可能大家能用得着。最近新冠肺炎闹得人心惶惶,噢,不对,改名了,叫:新冠感染了。只要专家建议个什么东西,什么东西绝对准脱销,而且是…

计算机软考高级好考吗?需要备考多久?

不简单,整体的通过率只有15%左右。 软考高级一共有五个科目。 信息系统项目管理师:零基础,有考证需求的或者从事管理的人员,项目经理可以考这个。 系统分析师:适合在项目开发过程中定制需求规格说明书,和编…

[内网渗透]—CS生成office宏钓鱼

简介 ​ 宏是一个批量处理程序命令,正确地运用它可以提高工作效率。微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力。如完打开word文件同时要打开某个文件的功能,必须要自己编写一段称之为宏的脚本。具体做法是在“工具”菜单“宏”-“…

图的简要介绍

1、图的基本概念 (1)定义 图是一种较为复杂的非线性结构。 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为G(V,E),其中,G表示一个图,V表示顶点的集合,E表示边的集合。 (2&…

Cookie和Session的区别

💟💟前言 ​ 友友们大家好,我是你们的小王同学😗😗 今天给大家打来的是 Cookie和Session的区别 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞👍 收藏⭐ 评论📄 小王的主页…

北京智和信通:IT资产全生命周期运维监控管理方案

IT资产是企业开展正常业务运营和拓展不可或缺的资源,也是企业财产的重要载体。随着信息科技的快速发展,各企业对IT资产的依赖逐渐增强,IT资产的可靠性和有效性面临着愈来愈大的挑战。例如IT资产管理混乱,通过维护手工台账的方式进…

vue入门(一)搭建vue项目,基础显示,指令

之前接触过vue,但是一直不是十分清晰,学的云里雾里,最近打算再次系统的整理一下,重新入门。还是根据vue官方文档一步一步的来,但是是属于简化的那种,会把我的学习过程都记录下来。 1.vue项目的搭建&#xf…

linux、window跨平台的用vs编程

跨平台的用vs编程 准备 创建linux的console程序 工具 – 选项,找到跨平台 连接linux的服务 注意,需要在linux系统那边配置以下的命令 sudo apt install build-essential 验证编译器是否被成功安装 gcc --versionsudo apt install openssh-server …

基于stm32 的简单的智慧农业系统, 有上位机,有下位机

1. 实现的功能 1. 下位机(stm32) (keil 5 ) 1. 按键key1 中断控制 LED 3 的亮灭 2. 按键key2 中断控制 温湿度的获取, (数据通过串口发送给 上位机) 3. 智能检测温湿度是否超标, (超标 开启警…

el-dialog实现拖拽功能示例代码

element UI中dialog组件经常会用到,如果能让其任意拖拽放到不同的位置就更好了,实现方法如下: dialogDraggable.js代码: import Vue from vue // v-dialogDrag: 弹窗拖拽 Vue.directive(dialogDrag, { bind(el, binding, vno…

【再学Tensorflow2】TensorFlow2的层次结构

TensorFlow2的层次结构Tensorflow的层次结构Tensorflow的低阶API示例线性回归模型准备数据定义模型训练模型DNN二分类模型准备数据定义模型训练模型Tensorflow的中阶API示例线性回归模型DNN二分类模型Tensorflow的高阶API示例线性回归模型定义模型训练模型DNN二分类模型定义模型…

微信小程序开发实战10_1 小程序支付业务介绍

移动支付已成大多数消费者日常使用的支付方式之一。移动支付拥有操作简单方便、无需带现金或银行卡,不用找零,目前超过四分之三的用户都在使用移动支付。小程序应用作为一个广泛使用的移动应用,自然也不会放弃移动支付这个大的蛋糕。本章将介…

opencv文件介绍

build:存放.h.hpp.lib文件 bin .dll etc:存放训练好的分类器,用于人脸识别 include:所有的头文件 opencv2 • calib3d:相机校准、姿态估计和三维重建 • core:核心功能模块 • dnn:深度学习模块…