Linux下的多线程编程:原理、工具及应用(2)

                                               🎬慕斯主页修仙—别有洞天

                                              ♈️今日夜电波:Flower of Life—陽花

                                                                0:34━━━━━━️💟──────── 4:46
                                                                    🔄   ◀️   ⏸   ▶️    ☰  

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

理解互斥锁

前置知识

通过伪代码进行理解

死锁

线程同步的概念

生产者消费者模型

概述

如何理解CP问题?

再次理解条件变量


理解互斥锁

        通过上一篇对于互斥锁操作的基本理解,现在我们从底层理解一下互斥锁的原理:

前置知识

        1、为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性
        2、从上面对于锁的理解,我们可以知道,锁其实是一个自定义的结构体类型。现在我们可以先这样简单的理解一下这个结构体类型,真正的结构体类型肯定是包涵很多安全属性之类的:

struct 
{int mutex=1;
}

        3、寄存器硬件在CPU内部只有一套,但是寄存器的内容每一个线程都有一份,拥有属于自己的上下文!

通过伪代码进行理解

        知道了上面的前置知识后,我们通过以下的伪代码真正的理解:

lock:

        注意上面的汇编语句都是原子性的!可以看到第一段movb $0,%a1表示为将数值0移动到寄存器 %a1 的最低字节,就是初始化%a1为0.然后通过xchgb %a1,mutex交换寄存器和内存单元中的数据。由于我们的锁的定义实际上就是一个自定义类型的定义,因此,他当然是存储在内存中的啦!我们可以通过以下图示来理解:

        接着继续理解,下面是一段if判断的伪代码,判断al寄存器中的内容是否大于0,如果我们的线程还在时间片内,那么他就是大于0的会返回0,当时间片用完,那么我们的其他寄存器等会保存上下文。新的进程进来了,同样有锁,需要初始化al为0,然后交换内存中的数据,但是!重要的来了,此时内存中的mutex是0!我们换后还是0!,此时进行if判断,就会挂起等待!!!这就是加锁的底层原理!

unlock:

        解锁可以看到movb $1,%a1就是初始化%a1为1,然后唤醒被因Mutex挂起等待的线程即可。

死锁

        死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

###死锁四个必要条件

互斥条件:一个资源每次只能被一个执行流使用

请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放

不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺

循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系

###避免死锁

破坏死锁的四个必要条件

加锁顺序一致

避免锁未释放的场景

资源一次性分配

线程同步的概念

###条件变量

当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。

例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。


####同步概念与竞态条件

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。

竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。在线程场景下,这种问题也不难理解

生产者消费者模型

概述

        生产者消费者模型,我们可以这样理解:有一间商店,消费者要去买东西,生产者要供货。而在这之间我们可以将生产者与消费者分别理解为线程,而商店理解为内存空间(基于特定空间的数据结构或者容器),而这个商店是用于进行执行流间数据的传递的!可以理解为临界资源!在这个模型中,我们需要保证生产消费的过程是安全的!因此我们需要遵守以下的原则:可以简称为“321原则”。

1、3种关系:(本质就是用锁&&条件变量维护)

生产者与生产者之间是什么关系?竞争—互斥

消费者与消费者之间是什么关系?竞争—互斥

生产者与消费者之间是什么关系?互斥&&同步

2、2种角色

生产者(1 or n)、消费者(1 or n) --线程或者进程

3、1个交易场所

内存空间

如何理解CP问题?

        在生产者消费者模型中,CP问题通常指的是生产者和消费者之间的同步问题,即如何保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区空时取出数据。这个问题可以通过使用多线程编程中的同步机制来解决。具体来说,有以下几个方面:

  1. 共享缓冲区:生产者和消费者共享一个固定大小的缓冲区,生产者向其中放入数据,消费者从其中取出数据。
  2. 同步机制:为了避免生产者在缓冲区满时继续生产数据,以及消费者在缓冲区空时继续消费数据,需要使用同步机制。常见的同步机制包括互斥锁(mutex)和条件变量(condition variable)。互斥锁用于保护共享资源,防止同时读写;条件变量则用于实现线程间的等待和通知机制。
  3. 状态一致性:需要确保在任何时刻,缓冲区的数据状态都是一致的。这意味着在消费者取出数据后,必须及时更新缓冲区的状态,以防止其他消费者错误地认为还有数据可取。
  4. 生产者限制:生产者在生产数据时,需要检查缓冲区是否已满。如果缓冲区已满,生产者必须等待,直到消费者取出数据并通知生产者可以继续生产。
  5. 消费者限制:消费者在消费数据时,需要检查缓冲区是否为空。如果缓冲区为空,消费者必须等待,直到生产者放入数据并通知消费者可以继续消费。
  6. 编码实践:在实现生产者-消费者模型时,需要注意避免竞态条件和死锁。正确的使用同步机制是解决这些问题的关键。
  7. 实际应用:生产者-消费者模型在分布式系统、并发编程和实时系统中非常常见,它是理解和解决并发问题的基础模型之一。

再次理解条件变量

        生产者消费者模型会有数据不一致的问题,上面提到为了满足线程同步,光加锁是不够的,可能会有饥饿的问题。因此,我们需要定义“条件变量”来让线程不做无效的锁申请,执行具有顺序。我们可以先简单的用以下的结构体先理解条件变量:

struct cond
{//条件是否就绪int flag;//维护一个线程队列tcb_queue;
}


                      感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

第二十四节 Java 异常处理

什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格…

Machine Vision Technology:Lecture3 Edge detection | Fitting

Machine Vision Technology:Lecture3 Edge detection | Fitting Finite difference filters有限差分滤波器Effects of noise噪声对边缘检测影响Derivative theorem of convolution卷积的导数定理Derivative of Gaussian filter高斯滤波器的导数Smoothing vs. deriva…

后端系统开发之——创建SpringBoot工程

原文地址:后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容: 前言 现在的市场环境,如果你单单只是作为前端工程师或者是后端工程师,在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

【ARM】UBL本地服务器离线激活license

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 UBL本地服务器离线激活license。 2、 问题场景 解决有用户外出时激活 license。 3、软硬件环境 1)、软件版本:MDK5.39 2)、电脑环境:Ubuntu 20.04 LTS 3&…

NCV4275CDT50RKG稳压器芯片中文资料规格书PDF数据手册引脚图图片价格功能

产品概述: NCV4275C 是一款低漏稳压器,可用于严酷汽车环境。它包括了较宽的运行温度范围和输出电压范围。输出调节为 5.0 V 或 3.3 V,额定输出电流为 450 mA。它还提供过电流保护、超温保护和可编程微处理器重置等多种功能。NCV4275C 采用 D…

linux ffmpeg编译

下载源码 https://ffmpeg.org/ csdn下载源码包 不想编译可以直接下载使用静态版本 https://ffmpeg.org/download.html https://johnvansickle.com/ffmpeg/ 根据cpu类型,下载解压后就可以直接使用了。 linux编译 安装底层依赖 yum install gcc yum isntall …

接口测试和功能测试有什么区别

本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分&#xff1…

vue3项目随笔1

1,Eslint Prettier 报错情况: 解决办法: (1)下载Prettier - code formatter (2)配置setting.json文件 文件 -> 首选项 -> 设置 -> 用户 -> Eslint "editor.defaultFormatter":…

浅易理解:非极大抑制NMS

什么是非极大抑制NMS 非极大值抑制(Non-Maximum Suppression,简称NMS)是一种在计算机视觉和图像处理领域中广泛使用的后处理技术,特别是在目标检测任务中。它的主要目的是解决目标检测过程中出现的重复检测问题,即对于…

认清趋势的力量!北大请摆摊鹅姨做演讲!阿伟告白失败,AI有资格做僚机?——早读(逆天打工人爬取热门微信文章解读)

趋势的力量,AWSL 引言Python 代码第一篇 人民日报 【夜读】最好的伯乐,是努力的自己第二篇 来啦新闻早班车要闻社会政策 结尾 “识时务者为俊杰,通机变者为英豪” 生活中,我们如骑行者穿越车水马龙 察觉人潮车流的趋势 不论体能优…

DCAI:Data-Centric AI 以数据为中心的AI

1. 什么是DCAI? 1.1. 当下的研究背景 想象当中的数据集:通常是干净且精选的(例如猫或狗的图片)。 猫就是猫,狗就是狗 实际现实生活中的数据集:非常混乱~ https://labelerrors.com/ 比如这个网站里提供了一些人们常用的开源数据集…

产品推荐 - ALINX XILINX FPGA开发板 Artix-7 XC7A100T-2FGG484I

01开发板介绍 此款开发板采用核心板扩展板的模式,方便用户对核心板的二次开发利用。FPGA使用的是Xilinx公司的ARTIX-7系列的芯片,型号为XC7A100T-2FGG484I。在核心板使用了2片MICRON公司的MT41J256M16HA-125 DDR3芯片,组合成32bit的数据总线…

栈的应用——括号匹配

用栈实现 1、初始化一个栈,用来存左括号 2、遍历扫描括号字符串 如果遇到左括号,无脑入栈如果遇到右括号,此时栈空返回false,不空的话进行括号匹配。匹配不成功返回false,匹配成功将栈顶的那个左括号出栈。 遍历完之后…

【PyTorch】成功解决ModuleNotFoundError: No module named ‘torch’

【PyTorch】成功解决ModuleNotFoundError: No module named ‘torch’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希…

Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

C++笔记:从零开始一步步手撕高阶数据结构AVL树

文章目录 高度平衡二叉搜索树实现一颗AVL树结点与树的描述——定义类AVL树的插入操作步骤1:按照二叉搜索树的方法插入结点步骤2:自底向上调整平衡因子步骤3:触发旋转操作(AVL树平衡的精髓)右单旋左单旋左右双旋右左双旋…

TSINGSEE青犀视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展,人工智能(AI)已经逐渐渗透到我们生活的各个领域,从智能家居到自动驾驶,从医疗诊断到金融风控,AI的应用正在改变着我们的生活方式。而数据、算法和算力,正是构成…

【矩阵】48. 旋转图像【中等】

旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,…

rust学习笔记(1-7)

原文 8万字带你入门Rust 1.包管理工具Cargo 新建项目 1)打开 cmd 输入命令查看 cargo 版本 cargo --version2) 使用 cargo new 项目名 在文件夹,按 shift 鼠标右键 ,打开命令行,运行如下命令,即可创建…

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…