Linux -- 線程同步

? 1.1條件變量

(1)當?個線程互斥地訪問某個變量時,它可能發現在其它線程改變狀態之前,它什么也做不了。
(2)例如?個線程訪問隊列時,發現隊列為空,它只能等待,只到其它線程將?個節點添加到隊列
中。這種情況就需要?到條件變量。
? 1.2同步概念與競態條件
(1)同步:在保證數據安全的前提下,讓線程能夠按照某種特定的順序訪問臨界資源,從而有效避饑餓問題
(2)競態條件:競態條件是并發編程中常見的問題,指多個線程或進程對共享資源的訪問順序不確定,導致程序行為不可預測或錯誤
競態條件的常見情況有:
(1)檢查后行動:對于main線程,如果文件a不存在,則創建文件a,但是在判斷文件a不存在之后,Task線程創建了文件a,這時候先前的判斷結果已經失效,(main線程的執行依賴了一個錯誤的判斷結果)此時文件a已經存在了,但是main線程還是會繼續創建文件a,導致Task線程創建的文件a被覆蓋、文件中的內容丟失等等問題
(2)非原子操作的++,--等操作:在這些非原子操作時會分成三步,內存先將數據搬到cpu,cpu計算,再將數據搬回內存,其中每一個步驟線程都可能被切換并且修改數據,導致該數據的更新丟失
(3)延遲初始化:在單例模式中,如果沒有適當的同步機制,可能導致多個線程同時創建實例
1.3條件變量函數
初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t
*restrict attr);
參數:
cond:要初始化的條件變量
attrNULL
銷毀
int pthread_cond_destroy(pthread_cond_t *cond)
等待條件滿?
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict
mutex);
參數:
cond:要在這個條件變量上等待
mutex:互斥量,等待期間解鎖,喚醒時再次加鎖
喚醒等待
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

? 1.4 生產者消費者模型

? ?產者消費者模式就是通過?個容器來解決?產者和消費者的強耦合問題。?產者和消費者彼此之間不直接通訊,?通過阻塞隊列來進?通訊,所以?產者?產完數據之后不?等待消費者處理,直接扔給阻塞隊列,消費者不找?產者要數據,?是直接從阻塞隊列?取,阻塞隊列就相當于?個緩沖區,平衡了?產者和消費者的處理能?。這個阻塞隊列就是?來給?產者和消費者解耦的。

? 生產者消費者模型的優點:(1)解耦合 (2)支持并發 (3)支持忙先不均

? 1.5基于BlockingQueue的?產者消費者模型

? BlockingQueue:在多線程編程中阻塞隊列(Blocking Queue)是?種常?于實現?產者和消費者模型的數據結構。其與普通的隊列區別在于,當隊列為空時,從隊列獲取元素的操作將會被阻塞,直到隊列中被放?了元素;當隊列滿時,往隊列?存放元素的操作也會被阻塞,直到有元素被從隊列中取出(以上的操作都是基于不同的線程來說的,線程在對阻塞隊列進程操作時會被阻塞)

簡單示例:

? 這里封裝了一個BlockQue類,成員變量說明:定義了最大容量,一個互斥鎖,生產者與消費者應該是互斥的,否則會導致數據錯亂,設置了兩個條件變量分別在隊列為空和滿的時候使線程進入等待,當隊列有元素或不為空時由生產者或消費者線程根據wait_nums來決定是否喚醒對應的等待線程。成員函數說明:生產者與生產者之間,消費者與消費者是互斥的,所以在進入生產和消費的時候只允許一個線程進入,隊列為空或滿時都會進入等待,此時為了防止偽喚醒使用while循環來控制。(偽喚醒的情況:直接使用pthread_cond_broadcast喚醒所有的生產線程,但是此時只能有一個線程拿到鎖,其他線程蘇醒了但是還在等待鎖,如果使用if判斷滿的話如果下一次鎖還是被生產者拿到,此時隊列還是滿的,但是接拿到鎖的線程還會繼續插入發生錯誤,使用while就是為了在偽喚醒以后多加一次判斷,如果條件沒有達到繼續進入條件等待。)

? 1.6為什么 pthread_cond_wait 需要互斥量?

(1)條件等待是線程間同步的?種?段,如果只有?個線程,條件不滿?,?直等下去都不會滿?,所以必須要有?個線程通過某些操作,改變共享變量,使原先不滿?的條件變得滿?,并且友好的通知等待在條件變量上的線程。
(2)條件不會?緣?故的突然變得滿?了,必然會牽扯到共享數據的變化。所以?定要?互斥鎖來保護。沒有互斥鎖就?法安全的獲取和修改共享數據。

? 1.7條件變量的封裝

2.POSIX信號量

? POSIX信號量和SystemV信號量作?相同,都是?于同步操作,達到?沖突的訪問共享資源?的,但POSIX可以?于線程間同步。

初始化信號量
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
參數:
pshared:0表?線程間共享,?零表?進程間共享
value:信號量初始值
銷毀信號量
int sem_destroy(sem_t *sem);
等待信號量
功能:等待信號量,會將信號量的值減1
int sem_wait(sem_t *sem); //P()
發布信號量
功能:發布信號量,表?資源使?完畢,可以歸還資源了。將信號量值加1
int sem_post(sem_t *sem);//V()

2.2基于環形隊列的?產消費模型

環形隊列采?數組模擬,?模運算來模擬環狀特性

環形隊列的?產消費模型代碼示例:

Sem封裝

RingBuffer.hpp

? 這里將Mutex和封裝好的Sem都應用了,需要查看具體及測試代碼的同學可以在我的gitee倉庫下的RingBuffer文件夾獲取,該項目單生產單消費以及多生產多消費都是支持的,生產與消費之間是并發的,相較于阻塞隊列生產者消費者模型提高了效率。

我的gitee倉庫https://gitee.com/toutie40/study_code.git

本文到此結束,感謝大家觀看,希望對你有所幫助,有錯誤請多多指教。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93920.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端進階指南:JavaScript性能優化實戰全解析

深入剖析 JavaScript 性能瓶頸&#xff0c;分享優化技巧與最佳實踐&#xff0c;讓你的前端應用更快、更穩、更流暢。 &#x1f4d1; 目錄 一、前言 二、性能瓶頸的常見來源 三、JavaScript代碼優化技巧 1. 避免重復計算 2. 合理使用防抖與節流 3. 使用事件委托 四、渲染…

RabbitMQ:SpringAMQP Direct Exchange(直連型交換機)

目錄一、案例需求二、基礎配置三、代碼實現直連型交換機也叫做定向交換機&#xff0c;通過RoutingKey綁定交換機與隊列直接的關系。 生產者源碼 消費者源碼 一、案例需求 在RabbitMQ控制臺中&#xff0c;聲明隊列direct.queue1和direct.queue2。在RabbitMQ控制臺中&#xff…

implement libtime on Windows

因為Windows的time命令和Linux的time命令不一樣&#xff0c;嘗試實現libtime libtime.h /** libtime.h - 跨平臺時間測量庫* 功能&#xff1a;執行外部命令并測量其運行時間和資源使用*/#ifndef LIBTIME_H #define LIBTIME_H#include <stdio.h> #include <stdlib.h>…

Unity進階--C#補充知識點--【C#各版本的新功能新語法】C#1~4與C#5

來源于唐老獅的視頻教學&#xff0c;僅作記錄和感悟記錄&#xff0c;方便日后復習或者查找 一.C#版本與Unity的關系 1.各Unity版本支持的C#版本 更多信息可以在Untiy官網說明查看 https://docs.unity3d.com/2020.3/Documentation/Manual/CSharpCompiler.html&#xff08;這個好…

水閘安全綜合監測系統解決方案

一、方案概述 水閘作為重要的水利工程設施&#xff0c;承擔著防洪、排澇、供水和灌溉等關鍵功能。其安全性直接關系到下游人民群眾的生命財產安全以及區域經濟的穩定發展。近年來&#xff0c;隨著極端天氣頻發和工程老化問題日益突出&#xff0c;水閘安全監測工作顯得尤為重要。…

基于單片機智能點滴輸液系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 該系統基于單片機控制技術&#xff0c;結合傳感器和無線通信模塊&#xff0c;實現對輸液過程的實…

AI數據倉庫管理提升效率

內容概要在數字化轉型浪潮中&#xff0c;AI數據倉庫管理正重塑企業數據處理格局。本部分簡要介紹其核心機制&#xff0c;即通過智能API接入外部數據源實現多平臺數據無縫整合&#xff0c;隨后應用數據清洗技術去除冗余信息&#xff0c;確保數據質量。同時&#xff0c;加密存儲機…

使用 Docker 安裝長安鏈管理平臺 + 部署區塊鏈與示例合約

文章目錄簡介登錄官網GithubPodman 配置&#xff08;Docker 配置 registry 地址&#xff09;安裝長安鏈管理平臺下載源碼docker-compose.yml登錄管理平臺部署區塊鏈Dockerfile構建鏡像部署長安鏈訂閱區塊鏈部署合約下載示例合約部署示例合約投票管理文件哈希存證查找存證信息區…

Python訓練營打卡 DAY 41 簡單CNN

知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch歸一化層…

云端賦能,智慧運維:分布式光伏電站一體化監控平臺研究

摘要 本文針對分布式光伏電站存在的監管困難、火災隱患、系統繁雜及運維不規范等行業痛點&#xff0c;提出AcrelCloud-1200光伏運維云平臺解決方案。平臺通過ANet-1E2S-4G網關集成多品牌逆變器數據&#xff0c;結合視頻監控與氣象站&#xff0c;實現電站全域監測&#xff1b;開…

CVPR 2025 | 具身智能 | HOLODECK:一句話召喚3D世界,智能體的“元宇宙練功房”來了

關注gongzhonghao【CVPR頂會精選】1.導讀1.1 論文基本信息論文標題&#xff1a;《HOLODECK: Language Guided Generation of 3D Embodied AI Environments》作者&#xff1a;Yue Yang*1, Fan-Yun Sun*2, Luca Weihs*4, Eli Vanderbilt4, Alvaro Herrasti4,Winson Han4, Jiajun …

迅為RK3568開發板搭建Ubuntu環境

本小節介紹開發所需 Ubuntu 環境的搭建方法。系統要求:Ubuntu 系統要求&#xff1a;Ubuntu18.04~21.10 版本。推薦使用 20.04 版本&#xff0c;內存 16GB 及以上&#xff0c;硬盤 100GB 及以上。Ubuntu 系統的用戶名不能包含中文字符。建議 Ubuntu 和 Windows 系統上安裝的 Dev…

【數據結構】用堆解決TOPK問題

設計一個算法&#xff0c;找出數組中最小的k個數。以任意順序返回這k個數均可。示例&#xff1a;輸入&#xff1a; arr [1,3,5,7,2,4,6,8], k 4 輸出&#xff1a; [1,2,3,4]比較替換堆頂的數時&#xff0c;不需要讓堆頂與數組的每一個數再進行比較&#xff0c;比較數組減去k個…

【深度長文】Anthropic發布Prompt Engineering全新指南

目錄 1.什么時候適合用提示工程? 2.如何進行提示工程 2.1 使用提示模板 2.1.1 使用提示模板和變量 2.1.2 何時使用提示模板和變量 2.1.3 提示模板示例 2.2 保持清晰和直接 2.2.1 如何保持清晰、具有上下文和具體 2.2.2 示例 ?2.3 使用示例&#xff08;多示例提示…

【基礎-判斷】HarmonyOS提供了基礎的應用加固安全能力,包括混淆、加密和代碼簽名能力

正確 解釋如下: 應用加固: 這是指對應用程序進行保護,使其更難被逆向工程、篡改或盜版。HarmonyOS 作為現代操作系統,確實提供了這樣的基礎安全能力。 混淆: HarmonyOS 的 SDK 提供了代碼混淆工具(通常基于 ProGuard 或類似技術)。開發者在構建應用時啟用混淆,可以將類…

HTML 框架:構建網頁布局的基石

HTML 框架&#xff1a;構建網頁布局的基石 引言 HTML 框架是網頁設計中不可或缺的一部分&#xff0c;它為網頁內容的布局提供了強大的支持。本文將深入探討 HTML 框架的概念、種類、應用以及如何有效地使用它們來構建網頁布局。 什么是 HTML 框架&#xff1f; HTML 框架是一種網…

[Linux]學習筆記系列 -- [mm][memblock]

文章目錄mm/memblock.c: Linux內核的“拓荒時代”內存管理器一、 核心問題&#xff1a;為什么需要 memblock&#xff1f;二、 核心原理與設計三、 在內核啟動流程中的角色四、 關鍵 API五、 總結include/linux/memblock.hmm/memblock.cmemblock_reserve 預留內存塊for_each_mem…

Java 面試八股文匯總(1000 道附答案解析)

在過 2 個月即將進入金九銀十了&#xff0c;然而面對今年的大環境而言&#xff0c;跳槽成功的難度比往年高了很多&#xff0c;很明顯的感受就是&#xff1a;對于今年的 java 開發朋友跳槽面試&#xff0c;無論一面還是二面&#xff0c;都開始考驗一個 Java 程序員的技術功底和基…

給純小白的Python操作 PDF 筆記

一、文件基礎打開與關閉 推薦用 with open(path, mode, encodingutf-8) as f:&#xff0c;自動完成 close()&#xff0c;避免泄露文件句柄。常見模式&#xff1a;r 讀&#xff0c;w 寫覆蓋&#xff0c;a 追加&#xff0c;rb/wb 二進制。Windows 默認編碼為 GBK&#xff0c;Linu…

vue使用vue-cropper實現圖片裁剪之單圖裁剪

vue制作的pc系統中(如若依系統)&#xff0c;需要實現按照固定尺寸進行裁剪后再進行圖片上傳&#xff0c;以下代碼講述的是實現單張圖片裁剪上傳。1.第一步需要安裝vue-croppernpm install vue-cropper2.第二步在需要的頁面進入代碼引入import {VueCropper} from "vue-crop…