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! 

                                       

                                                                        给个三连再走嘛~  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Acwing.1262 鱼塘钓鱼(多路归并)

题目 有 N个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N5时,如下表: 即:在第 1个鱼塘中钓鱼第 1分钟内可钓到 10条鱼,第 2分钟内只能钓到 8条鱼,……,第 5分钟以后再…

Vite为什么比Webpack快

一、引言 主流的前端构建工具包括以下几种: Webpack:当下最热门的前端资源模块化管理和打包工具。它能够将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。同时,Webpack还支持代码分割,可以按需加载模块&#…

webshell隐藏哥斯拉流量修改sqlmap改ua

webshell隐藏 windows 1.隐藏shell attrib "文件名" s h attrib "文件名" -s -h 2.利用系统代号隐藏shell 创建文件夹名为Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D},此时文件夹将变成我的电脑,无法看到里面的东西&…

【快捷部署】002_Flink(1.17.2)

📣【快捷部署系列】002期信息 编号选型版本操作系统部署形式部署模式002Flink1.17.2CentOS 7.Xtgz包单机 👉 演示视频 Flink一键安装(本地模式) install-flink.sh 脚本内容 #!/bin/bash ####变量 ###执行脚本的当前目录 mydir$…

《Learning Hierarchical Modular Networks for Video Captioning》论文笔记

论文信息 原文链接: Learning Hierarchical Modular Networks for Video Captioning | IEEE Journals & Magazine | IEEE Xplore 原文代码 GitHub - MarcusNerva/HMN: [CVPR2022] Official code for Hierarchical Modular Network for Video Captioning. Ou…

HarmonyOS应用开发-Stage模型开发概述

基本概念 UI框架 HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。提供了应用UI开发所必需的能力:多种组件、布局计算、动画能力、UI交互、绘制。 方舟开发框架针对开发者提供了两种开发范式: 基于ArkTS…

springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法

sringboot原本使用的是logback日志框架,将它去掉,修改为log4j2日志框架后,往往会出现以下错误: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/ch/qos…

java虚拟机的堆核心知识介绍

Java虚拟机(JVM)的堆(Heap)是Java内存模型中一个至关重要的部分。它是运行时数据区,用于存储Java对象实例。堆是垃圾收集器工作的地方,也是Java应用程序内存管理的关键区域。在本教程中,我们将深…

uniapp h5 部署

uniapp 配置 服务器文件路径 打包文件结构 //nginx 配置 server {listen 8300;server_name bfqcwebsiteapp;charset utf-8;#允许跨域请求的域,* 代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Control-Allow-C…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法,如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

汽车电子零部件(3):ADAS前视感知系统FLC

前言: 比如车道保持和车道改变这种场景,如何进行车道的识别,如何进行周围车辆的识别,这算是ADAS中的一个场景,其中就会用到FLC前视感知系统。还有比如前向物体识别,前向车辆识别等。 再往大里说那就是车联网了: 除了前向也可能有其他部位

【计算机网络篇】计算机网络的性能指标

文章目录 🍔计算机网络的性能指标🗃️常见的计算机网络性能指标⭐速率⭐带宽⭐吞吐量⭐时延⭐时延带宽积⭐往返时间⭐利用率⭐丢包率 🔎总结 🍔计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 …

如何通过做自己喜欢的事来赚钱?

今天想要跟大家分享一本我今年反复读过最多次的一本书《The Almanack of Naval Ravikant 纳瓦尔宝典》。我之前也有介绍过Naval Ravikant,他是硅谷创业界的一位传奇人物,创办了知名的天使投资平台AngelList。早期他还投资超过了200家科技公司,其中很多都成为了今天的科技巨头…

SpringBoot集成Redisson实现接口限流

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Dat…

MIT 6.S081---Lab: locks

Memory allocator (moderate) 修改kernel/kalloc.c,修改kmem声明并定义结构体数组: 修改kernel/kalloc.c中的kinit函数,对kmemList进行初始化: 修改kernel/kalloc.c中的kfree函数,获取当前的cpuid并将释放的内存添加到…

Ubuntu Linux - Primavera P6 EPPM 安装及分享

引言 根据计划,近日我制作了基于Ubuntu Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primavera销售代表取得联系,以获取所需的应…

抖音获得抖音商品详情 API 返回值说明

抖音(Douyin)的商品详情API返回值通常会包含有关商品的详细信息。这些信息可能包括但不限于商品ID、商品名称、商品价格、商品图片、商品描述、商品销售属性等。以下是一个简化的抖音商品详情API返回值示例和说明: 调用链接获取详情 item_g…

江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟

一.定时器定时中断 1.原理 2.硬件 3.程序 此时CK_PSC72M,定时1s,也就是定时频率为1Hz,所以可以PSC7200-1,ARR10000-1。 Timer.c: #include "stm32f10x.h" // Device headerextern uint16_t Num;//声明跨文件的…

2024大广赛朗圣药业都有哪些命题?

大广赛官网网站在3月8日公布了朗圣药业2024年的赛事命题,本文就给大家介绍一下都有哪些广告主题和形式。 广州朗圣药业有限公司成立于2003年,是专注于生殖健康用药、慢性病用药、外用药领域的研发、生产、营销于一体的高科技制药企业。秉持“让人类生殖…

YOLOv9改进 添加可变形注意力机制DAttention

一、Deformable Attention Transformer论文 论文地址:arxiv.org/pdf/2201.00520.pdf 二、Deformable Attention Transformer注意力结构 Deformable Attention Transformer包含可变形注意力机制,允许模型根据输入的内容动态调整注意力权重。在传统的Transformer中,注意力是…