【线程的互斥】

线程的互斥

    • 临界区资源
    • 多个线程的运行
    • 多个线程对同一资源的竞争
    • 原子性
    • 保持线程之间地互斥
      • 互斥量(锁的原理)为什么是原子的
    • 正确使用锁

临界区资源

进程创建线程,是共享内存的,可以对共享的资源有很方便的操作,当一些共享资源可以被多个线程进行访问操作,该共享的资源被称之为临界资源。比如多个线程如果都有对全局的静态变量进行访问或操作,则该变量就是共享资源。每个执行流的代码访问临界资源就叫做临界区。
在这里插入图片描述

多个线程的运行

多个线程在执行的时候,调度哪一个执行流是程序员不可知道的,是由操作系统OS来进行调度的,多个线程可能会有交叉的现象,这种现象是不允许的,比如订票的系统,如果两个线程出现了交叉的现象,可能就会造成最后一张票被两个线程进行获取,两个线程在竞争。有些线程的执行是需要其他的线程执行完之后才能被调度,线程A的资源可能要等到线程B运行完才会有,所以线程会有先后顺序。

多个线程对同一资源的竞争

在这里插入图片描述

1step:当票数为1的时候,线程A进行抢票,线程A先对票数进行检查,如果大于1,则进行先一步购票,对票数自减。线程A已经判断出票数剩余1,进行抢票,但系统发现线程A分配的运行时间已经到了,但线程A还未进行购票进行票数自减,然后暂时退出自己的执行流,但线程A会把已经处理的数据(CPU寄存器的数据,判断票数大于1)进行保存(保存在自己进程的上下文),在下次再次被调度时继续使用。
2step:此时,线程B开始被调度进行抢票,假设线程B的时间片足够长,线程B开始执行,也对票数进行判断,票数为1,因为线程A还没对票数进行自减时间片就到了,所以在系统的内存当中,票数依旧为1,然后线程B购票,对票数进行了自减,最后票数为0了,然后再把0的票数拷贝到系统内存,最后票数为0了。此时线程B结束。
3step:过了极短的时间,线程A又有了时间进行调度,因为线程A在之前调度时已经逻辑运算判断票数为1,并把数据保存在自己的进程上下文当中,再次调度时,线程A就会执行下一步购票的任务,首先会在系统的内存当中拷贝剩余的票数到CPU,然后进行自减,因为票数已经被线程B已经自减为0了,所以线程A会对票数0进行自减,最后得到-1的值,然后再把-1拷贝会系统内存当中。会发现剩余票数为-1,导致了数据不正确。对与上述的票资源,本质上是临界资源。是多线程程序中的共享变量。引发数据不准确的原因,又是因为线程时间片结束时,但执行流还未执行完,导致有些数据保存到进程独立的上下文最后因为这些行为不是原子的所导致。这种行为就是线程不是安全的。

原子性

在这里插入图片描述

票数的操作在C语言的情况下是不原子的,经过编译后会有三条汇编语句,虽然每条汇编语句是原子的。两条C语句经过汇编会生成5条汇编语句,每执行到一条汇编时,线程都有可能会被操作系统切换,一旦还没执行完全部任务,就会把这些寄存器的数据保存到自己的独立上下文。即使每条汇编是原子的,但多条汇编不一定是原子的,所以C语句不是原子的,每个线程调用时,不能保证在执行完整的过程中,保证该资源一直时一个线程独享的。

保持线程之间地互斥

为了保证共享资源得安全性,临界资源只能由一个执行流访问并进行操作,需要使用一些手段让临界资源只有一个执行流,这种就是互斥。可以通过添加互斥量(锁)这个资源来对多个线程对临界资源进行单独访问操作(加锁)。当执行流已经完成了临界资源得访问和临界区得代码执行完毕,就可以释这个互斥量(解锁)让其他得线程可以访问临界资源和申请锁这个资源继续单独得访问临界资源(锁是原子的)。

int cnt = 100;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;// 申请锁资源并初始化,这个锁是全局的
///
while(true)
{pthread_mutex_lock(&mutex);//加锁if (cnt > 0)cnt--;pthread_mutex_unlock(&mutex);//解锁
}

如果一个线程成功申请了锁这个变量,在解锁和加锁这段临界区的临界资源,其他线程是无法访问到的,即使申请成功锁得线程随时被OS切换不调度,必须要等待该线程把锁资源释放掉了(等待过程就是阻塞得过程),其他线程才有机会申请到锁资源并访问临界资源(锁本身也得原子的)。

互斥量(锁的原理)为什么是原子的

互斥量为了保证自身是原子性的,为了实现这一目的,大多数体系结构提供了swap或exchange指令,这些指令用于交换两个操作数(通常是寄存器%al和内存单元mutex,寄存器的数据为线程独有的)的值。由于这些指令的执行是原子的,因此它们可以在多线程环境中安全地用于加锁和解锁操作。当%al为1和内存mutex为0时表明成功获得了锁。当线程完成对共享资源的访问并准备释放锁时,它只需将内存中的锁变量值重置为0即可。这通常可以通过简单的写入指令(而非swap或exchange指令)完成,因为此时没有其他线程会尝试获取锁。最后,多个线程达到了互斥的目的,此时,线程才是安全的,之前不加锁的时候是线程不安全的。
在这里插入图片描述

正确使用锁

对于临界资源,多个线程访问,进行申请锁,则每个线程需要申请的时同一个锁才有意义。如果操作不当,会产生死锁问题。
产生死锁的必要条件

  • 互斥条件:一个资源每次只能被一个执行流使用,因为要使用了锁。
  • 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放,一直独占该锁资源。
  • 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系。
    破坏死锁的四个必要条件
  • 避免死锁。
  • 加锁顺序一致。
  • 避免锁未释放的场景。
  • 资源一次性分配。

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

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

相关文章

【vue-2】v-on、v-show、v-if及按键修饰符

目录 1、v-on事件 2、按键修饰符 3、显示和隐藏v-show 4、条件渲染v-if 1、v-on事件 创建button按钮有以下两种方式&#xff1a; <button v-on:click"edit">修改</button> <button click"edit">修改</button> 完整示例代码…

蜂窝物联四情监测:助力农业升级,科技赋能打造丰收新篇章!

农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生产提供及时、科学的数据支持&#xff…

【日常积累】jira安装与配置

jira简介 Jira 是一个由 Atlassian 开发的功能强大的项目管理和问题跟踪工具&#xff0c;广泛应用于软件开发、项目管理、缺陷跟踪和服务管理等领域。Jira 的多功能性和高度的可定制性使其成为一个强大的工具&#xff0c;适用于各种规模的团队和项目。无论是软件开发、项目管理…

浅谈JMeter体系结构

JMeter体系结构详解 JMeter是一款功能强大的开源性能测试工具&#xff0c;广泛应用于Web应用、数据库、FTP服务器等多种场景下的负载和压力测试。其灵活的体系结构设计使得测试计划的创建、执行与结果分析变得高效而直观。本文将深入解析JMeter的三维空间体系结构&#xff0c;…

C语言——小知识和小细节19

一、奇数位与偶数位互换 1、题目介绍 实现一个宏&#xff0c;将一个整数的二进制补码的奇数位与偶数位互换。输出格式依旧是十进制整数。示例&#xff1a; 2、分析 既然想要交换奇数位和偶数位上的数字&#xff0c;那么我们就要先得到奇数位和偶数位上的数字&#xff0c;那么…

又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。

总有自媒体人&#xff0c;为了些许流量&#xff0c;在大放厥词&#xff0c;说截个图给AI&#xff0c;AI就能输出前端代码&#xff0c;这是啥都敢说&#xff0c;吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图&#xff0c;你让AI生成代码&#xff0c;取代前…

Youngter-drive

BUUCTF逆向题Youngter-drive-CSDN博客 逆向每日一题----Youngter-drive题解-CSDN博客 借鉴博客,写得比我好 upx拖壳 upx -d Youngter-drive.exe 这道题我不知道为什么,我这里是运行不了的,也没有找到原因 int __cdecl main_0(int argc, const char **argv, const char **env…

Nginx 的原理解析 worker 配置及相关问题 -细节狂魔

文章目录 前言Nginx 的最基本的执行过程&#xff08;master & worker&#xff09;worker 是如何进行工作的 一个 master 和 多个 woker 有哪些好处1、可以使用 nginx 热部署2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断 woker 设置多少才…

【知识图谱】探索攻略:基础、构建、高级应用与相关论文方向

【知识图谱】相关文章汇总 写在最前面一、什么是知识图谱&#xff1f;二、相关历史文章代码实现&#xff1a;简单的知识图谱可视化知识图谱前身&#xff1a;信息抽取知识图谱应用1&#xff1a;社交网络分析知识图谱应用2&#xff1a;威胁情报挖掘知识图谱应用3&#xff1a;Code…

Python小游戏——俄罗斯方块

文章目录 项目介绍环境配置代码设计思路1.初始化和导入库&#xff1a;2.定义颜色和屏幕尺寸&#xff1a;3.定义游戏逻辑&#xff1a;4.游戏循环&#xff1a; 源代码效果图 项目介绍 俄罗斯方块游戏是一款经典的益智游戏&#xff0c;玩家通过旋转和移动各种形状的方块&#xff…

【NumPy】关于numpy.clip()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Gradle筑基——Gradle Maven仓库管理

基础概念&#xff1a; 1.POM pom:全名Project Object Model 项目对象模型&#xff0c;用来描述当前maven项目发布模块的基础信息 pom主要节点信息如下&#xff1a; 配置描述举例&#xff08;com.android.tools.build:gradle:4.1.1&#xff09;groupId组织 / 公司的名称com.…

初学Echart

创建一个html文件 1.引入 点击链接----快速上手网址&#xff1a;快速上手 - 使用手册 - Apache ECharts 复制这一串【这个是引入echart路径】 引入到这里 2.使用 我们在上一步---点击返回--往下翻---找到完整代码--复制黏贴 复制粘贴后--总体长这样 <!DOCTYPE html> &…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序&#xff0c;基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用&#xff0c;获取API 密钥等和在之前的博客中基本相同&#…

[C++]debug介绍+debug时如何查看指针指向内存处的值

一、简介 预备工具和知识&#xff1a;使用使用VSCode使用Debug。 本文简介&#xff1a;本文将简要介绍debug中Continue&#xff0c;Step Over&#xff0c;Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址&#xff08;指针&#xff09;的值&#xff1b; 二、D…

连公司WiFi后,无法访问外网,怎么回事,如何解决?

文章目录 封面问题描述问题探究什么是DNS&#xff1f;分布式&#xff0c;层次数据库如何理解分布式&#xff1f;如何理解层次&#xff1f; 本地DNS服务器迭代查询&#xff0c;递归查询DNS缓存参考资料 封面 问题描述 从甲方项目组返回公司后&#xff0c;我习惯性连上公司WiFi&…

视频号小店去哪里找货源?最全货源渠道分享!

大家好&#xff0c;我是电商糖果 视频号小店因为是这两年电商行业新出来的黑马&#xff0c;吸引着不少商家入驻。 入驻了商家中很多都没有自己的货源渠道。 他们基本都是从无货源开始起步&#xff0c;后期通过积累资源&#xff0c;慢慢搭建属于自己的货源渠道。 可是渐渐的…

算法的时间与空间复杂度

算法是指用来操作数据、解决程序问题的一种方法。对于同一问题&#xff0c;使用不同的算法&#xff0c;也许最终结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。 那我们该如何去衡量不同算法之间的优劣呢&#xff1f;主要还是从算法所占用的【时间】和…

5.26机器人基础-空间描述和变换-总结

非目录 方便我找 重点 逆解 位姿矩阵的几何意义 实际坐标需要除以比例因子才能得到 比例因子的好处&#xff1a;在计算机的储存更加简单方便&#xff0c;例如x,y,x原先很大时&#xff0c;等比例改变 位姿坐标的齐次变换&#xff1a;左乘齐次坐标 从端点到末端&#xff0c…

集合竞价选股策略实战测试

2.3.2版本发布的集合竞价选股策略是网友吴PSYP提供的&#xff0c;团队按照策略实现的选股算法&#xff0c;最近半个月对策略进行的实战测试&#xff0c;从集合竞价选股开始&#xff0c;到股票收盘&#xff0c;收盘价格大于集合竞价价格&#xff0c;算作盈利&#xff0c;测试结果…