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
英文地址,請注明出處:http://en.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…