Linux第十三讲:线程同步和互斥

Linux第十三讲:线程同步和互斥

  • 1.线程互斥
    • 1.1进程线程间的互斥背景概念
    • 1.2什么是锁
      • 1.2.1认识锁,理解锁
  • 2.线程同步
    • 2.1条件变量
    • 2.2生产和消费模型
    • 2.3基于阻塞队列(blockqueue)的生产消费模型
      • 2.3.1单生产,单消费的阻塞队列模拟实现
      • 2.3.2多生产,多消费的阻塞队列模拟实现
    • 2.4生产消费模型好处补充
  • 3.POSIX信号量
    • 3.1什么是POSIX信号量
    • 3.2基于唤醒队列的生产消费模型概念
    • 3.3信号量接口的认识和信号量的封装
    • 3.4基于环形队列的生产消费模型的模拟实现
      • 3.4.1单生产,单消费
      • 3.4.2多生产,多消费
  • 4.日志与线程池
    • 4.1日志
      • 4.1.1日志的基本概念
      • 4.1.2日志的实现
    • 4.2线程池
      • 4.2.1线程池的实现
        • 4.2.1.1普通版本的线程池实现
        • 4.2.1.2单例模式 && 饿汉 && 懒汉方式
        • 4.2.1.3单例式线程池的实现
  • 5.线程安全与重入问题
  • 6.死锁问题
    • 6.1什么是死锁
    • 6.2死锁的必要条件
    • 6.3避免死锁
  • 7.STL、智能指针和线程安全问题

1.线程互斥

1.1进程线程间的互斥背景概念

在这里插入图片描述

1.2什么是锁

当多个线程并发操作共享变量时,容易带来一些问题:
在这里插入图片描述
为什么会引发这种问题呢?:
在这里插入图片描述

1.2.1认识锁,理解锁

通过上面的问题,我们引入锁的概念:
在这里插入图片描述
锁的使用如下:
在这里插入图片描述
感性理解锁:
在这里插入图片描述
锁的原理:
在这里插入图片描述
C++也提供了锁的接口,可以自行查看

2.线程同步

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

我们先感性理解线程同步:
在这里插入图片描述

2.1条件变量

感性理解条件变量:
在这里插入图片描述
了解了条件变量,那么条件变量该如何使用呢?:
在这里插入图片描述
我们通过代码来展示条件变量实现的线程同步操作:
在这里插入图片描述

2.2生产和消费模型

在这里插入图片描述

2.3基于阻塞队列(blockqueue)的生产消费模型

什么是阻塞队列:
在这里插入图片描述

2.3.1单生产,单消费的阻塞队列模拟实现

在这里插入图片描述
完整代码实现,上面没有debug,下面的debug了:
在这里插入图片描述

2.3.2多生产,多消费的阻塞队列模拟实现

多生产,多消费的代码和单生产,单消费的相同,因为无论是多少生产者或消费者,都只有一个线程能够进入临界区域!

2.4生产消费模型好处补充

在这里插入图片描述

3.POSIX信号量

和System V类似,POSIX只是一种标准。

3.1什么是POSIX信号量

在这里插入图片描述

3.2基于唤醒队列的生产消费模型概念

在这里插入图片描述

3.3信号量接口的认识和信号量的封装

在这里插入图片描述

3.4基于环形队列的生产消费模型的模拟实现

3.4.1单生产,单消费

在这里插入图片描述

3.4.2多生产,多消费

多生产,多消费的模拟实现就和单生产,单消费的模拟实现有所不同。
因为单生产消费只需要维护生产者和消费者之间的互斥和同步关系,使用信号量完全可以实现。
而多生产消费还需要维护生产者之间的互斥关系,以及消费者之间的互斥关系,所以这里需要两把锁来维护:
在这里插入图片描述

进一步理解信号量:
1.信号量把对临界资源是否存在,是否就绪,以原子性的形式,在需要访问临界资源之前就做出判断了
2.如果资源可以拆分,比如数组,那么可以考虑使用sem
如果资源不可拆分,比如阻塞队列,就使用mutex

4.日志与线程池

什么是线程池?:
在这里插入图片描述
然而线程池每天的运行结果我们想要实时查看,就需要用到日志记录

4.1日志

4.1.1日志的基本概念

在这里插入图片描述
那么这样的日志该如何实现呢?:

4.1.2日志的实现

在这里插入图片描述
完整代码如下:
在这里插入图片描述

4.2线程池

在这里插入图片描述

4.2.1线程池的实现

4.2.1.1普通版本的线程池实现

在这里插入图片描述
全部代码如下:
在这里插入图片描述

4.2.1.2单例模式 && 饿汉 && 懒汉方式

在这里插入图片描述
饿汉方式和懒汉方式的不同:
我们将使用懒汉方式实现线程池,而懒汉方式被使用的次数更多。
因为我们并不能确定什么时候需要使用到类对象,如果类对象很大,提前被创建,那么在不使用的这段时间内,类对象占用的空间也不能被其它对象使用,会造成资源的浪费。
操作系统也有很多懒汉方式的应用:
当我们malloc时,并不会直接申请物理内存,而是先申请虚拟内存。当我们需要使用物理内存时,才通过缺页中断的方式,申请物理内存。

4.2.1.3单例式线程池的实现

那么我们如何保证只创建一个对象呢?:
在这里插入图片描述

5.线程安全与重入问题

在这里插入图片描述

6.死锁问题

6.1什么是死锁

在这里插入图片描述

6.2死锁的必要条件

知道什么是死锁,那么就需要解决死锁。只有知道了死锁的生成条件,那么破坏其中任意一个条件,就会让死锁问题解决:
在这里插入图片描述

6.3避免死锁

知道了死锁的必要条件,破坏任意一个条件就可以避免死锁:
在这里插入图片描述

7.STL、智能指针和线程安全问题

1.STL中的容器不是线程安全的,因为STL的设计初衷就是将性能挖掘到极致,如果加锁就必然会破坏性能问题。而且对于不同的容器,加锁的方式也会不同
2.智能指针是否是线程安全的?:1/对于unique_ptr,由于只是在当前代码块范围内生效,所以不涉及线程安全问题 2/对于shared_ptr,使用了引用计数,但是标准库实现时考虑了这个问题,将引用计数设置为原子操作
3.也有很多其他的锁:悲观锁和乐观锁(了解即可):
在这里插入图片描述

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

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

相关文章

SAP 简单的AMDP demo 练习使用

SAP AMDP(ABAP Managed Database Procedure)是SAP的一项先进技术,用于在SAP HANA数据库上执行高性能的数据库操作。它允许ABAP开发人员编写数据库过程,这些过程可以在数据库级别上执行,从而实现更快的数据处理和更高的…

Maven JAR Plugin 插件使用说明

Maven JAR Plugin 插件使用说明1 Maven JAR Plugin 插件地址2 Maven JAR Plugin 特点3 maven-assembly-plugin 的用法3.1 无依赖项 maven-jar-plugin 配置3.2 有依赖项 maven-jar-plugin 配置3.3 配合maven-dependency-plugin 将依赖复制到指定位置1 Maven JAR Plugin 插件地址…

QT+Yolov8 推理部署,ONNX模型 ,实例分割+目标检测

QTYolov8 实例分割、目标检测推理。QT源码。 程序准备/版本:QT creator QT6.8 编译器:MSVC2022 opencv:4.7 onnxruntime:1.16.0 cpu版本 QTyolo推理部署程序部分源码: #include "aitoolinterface.h" #include "ui_aitoolinterface.h" #include <QDebu…

【java实现一个接口多个实现类通用策略模式】

java实现同个接口多个实现类通用策略模式 项目业务中&#xff0c;有多个平台&#xff0c;多个平台直接有相同的业务&#xff0c;只有一个接口入口&#xff0c;但是 不同的平台入口&#xff0c;虽然接口相同&#xff0c;参数相同&#xff0c;但是各自的具体实现不同&#xff0c;…

leetcode-139. 单词拆分-C

暴力回溯回溯过程就是一个决策树模型&#xff0c;从所有选择中找到合适的继续&#xff0c;否则回到上一级继续。该方法思路简单&#xff0c;时间复杂度过高&#xff0c;大概1/4的用例超时。 bool backtrack(char *s, int cur, char** wordDict, int wordDictSize) {// 基线条件…

《彩色终端》诗解——ANSI 艺术解码(DeepSeek)

AIi诗解通吾灵&#xff0c;直抄原文享分玲。 笔记模板由python脚本于2025-08-18 23:35:59创建&#xff0c;本篇笔记适合喜欢诗&代码的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Python官网…

抓包工具tcpdump详细指南

目录 1. 核心功能与特性 2. 关键参数速查表 3. 基础命令 3.1 协议/端口过滤 3.2 IP 地址过滤 3.3 高级逻辑组合 3.4 控制输出详细度 3.5 解析包内容 3.6 特殊包过滤 3.7 限制抓包数量 3.8 过滤特定大小包 3.9 过滤提升性能 ​​​​​​3.10 多网卡绑定 3.11 高级…

三高架构杂谈

我们的秒杀请求到了tomcat之后&#xff0c;我整个请求到了后端&#xff0c;我们怎么抗住高并发 也就是让他1s抗住10w的订单量&#xff0c;该怎么做 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>…

后端通用基础代码

后端通用基础代码 通用基础代码是指&#xff1a;“无论在任何后端项目中&#xff0c;都可以复用的代码。这种代码一般 “一辈子只用写一次” &#xff0c;了解作用之后复制粘贴即可&#xff0c;无需记忆。 目录结构如下&#xff1a;1、自定义异常 自定义错误码&#xff0c;对错…

基于51单片机WIFI心率计脉搏体温测量仪APP设计

1 系统功能介绍 本设计基于 STC89C52 单片机&#xff0c;结合 脉搏传感器、温度传感器 DS18B20、LCD1602 液晶显示器、WiFi 模块 等外设&#xff0c;构建了一个 WiFi 心率计脉搏体温测量仪 APP 系统。系统能够实现对人体心率与体温的实时采集、处理、显示和远程上传&#xff0c…

从零到一构建企业级GraphRAG系统:GraphRag.Net深度技术解析

当RAG遇上知识图谱&#xff0c;会碰撞出怎样的火花&#xff1f;本文将带你深入探索GraphRag.Net这个开源项目&#xff0c;看看如何用.NET技术栈打造一个企业级的图谱增强检索系统。 引言&#xff1a;为什么我们需要GraphRAG&#xff1f; 在AI大模型时代&#xff0c;RAG&#x…

前端Element-plus的选择器 el-select 清空内容时,后端对应的更新方式,支持更新为null

1、所属小类选择器 el-select 清空内容时&#xff0c;前端通过事件设置为空字符串clear"handleSmallCategoryClear"【所属小类选择器】只能选择&#xff0c;不能输入信息<script setup lang"ts" name"QualityFileInfoDialog"> ...... // 所…

【笔记】和各大AI大语言模型合作写项目—slirp.go

最近和各大AI大语言模型一起合作写了个小项目&#xff0c;让大家看看AI离取代人类还差多远。 开发大家都在一个共享环境下&#xff0c;连docker都不能运行&#xff0c;rootless也没有。不过好在linux环境&#xff0c;弄个proot能apt或者yum install自由&#xff0c;但是诸如pod…

国标:开展环境卫生满意度调查

随着社会的进步和人们生活水平的提高&#xff0c;&#xff08;满意度调查&#xff09;&#xff08;问卷调查&#xff09;&#xff08;第三方市场咨询公司&#xff09;对生活品质的追求以及对环境保护的重视已经成为了当下社会的主旋律。在这样的背景下&#xff0c;环境卫生问题…

【办公类-54-08】20250902 2025学年第一学期班级点名册模版(双休国定假涂成灰色、修改标题和页眉,批量导出PDF)根据新Excel模版,标题增加园区、空姓名行填充灰色

背景需求: 之前做了优化过的点名册 【办公类-54-07】20250901 2025学年第一学期班级点名册模版(双休国定假涂成灰色、修改标题和页眉,批量导出PDF)-CSDN博客文章浏览阅读984次,点赞27次,收藏29次。【办公类-54-07】20250901 202学年第一学期班级点名册模版(双休国定假…

【C++知识杂记1】智能指针及其分类

智能指针&#xff08;smart pointer&#xff09; 是 C11 引入的一类 模板类&#xff0c;用来封装原始指针&#xff0c;自动管理堆内存的生命周期&#xff0c;避免出现 内存泄漏 和 悬空指针&#xff08;野指针&#xff09; 的问题。 当智能指针对象离开作用域时&#xff0c;它会…

vue从入门到精通:搭建第一个vue项目

目录 Vue是什么 一、nodejs安装 二、安装Vue CLI 三、创建Vue项目 四、配置vue.config.js文件 五、创建第一个应用hello word Vue是什么 Vue是一款‌用于构建用户界面的 JavaScript 渐进式架构‌既可作为库(仅关注视图层)也可扩展为框架,支持从静态页面到复杂单页应用…

C# Queue源码分析

Queue<T> 是 .NET 中实现队列&#xff08;先进先出&#xff09;的一种泛型集合类。它基于数组实现&#xff0c;支持动态扩容、线程不安全&#xff0c;适用于大多数需要队列结构的场景。一、类结构与字段说明 public class Queue<T> : IEnumerable<T>, IColle…

微服务之注册中心与ShardingSphere关于分库分表的那些事

小伙伴们&#xff0c;你们好呀&#xff01;我是老寇&#xff01;跟我一起学习注册中心与ShardingSphere怎么一起使用 使用 nacos-shardingsphere例子&#xff0c;请点击我 注意&#xff1a;需要自己提前创建数据库和表 create database kcloud_platform_test;DROP TABLE IF…

python遇到异常流程

在 Python 中&#xff0c;程序遇到异常时的退出行为取决于是否对异常进行了捕获和处理&#xff1a;未捕获的异常&#xff1a; 如果异常发生后没有被 try-except 语句捕获&#xff0c;程序会立即终止&#xff0c;并返回一个非零的退出码&#xff08;通常是 1&#xff09;&#x…