同步與互斥學習筆記

一、基本概念

同步與互斥是多任務/多線程編程中的兩個核心機制:

  • 同步:指多個任務之間存在明確的先后順序,一個任務必須等待另一個任務完成某些操作后才能繼續執行。

  • 互斥:指多個任務在同一時刻爭搶使用同一資源(臨界資源),必須通過某種機制保證同一時間只有一個任務可以使用該資源。


二、線程安全問題的由來

問題描述

當多個任務同時訪問一個共享資源(如全局變量)時,如果沒有適當的保護機制,就會出現數據不一致的問題。

示例分析:全局變量?count++

c

int count = 0;
// 兩個線程同時執行 count++

count++?實際上包含三個步驟(非原子操作):

  1. 讀取?count?的值到寄存器

  2. 對寄存器中的值加 1

  3. 將結果寫回?count?的內存地址

執行流程(可能出現的問題):

  1. 線程 A 讀取?count = 0,準備加 1;

  2. 此時切換到線程 B,也讀取?count = 0,完成加 1 并寫回,count?變為 1;

  3. 切換回線程 A,繼續執行加 1(基于之前讀到的 0),寫回后?count?仍為 1。

預期結果為 2,實際結果為 1,這就是典型的線程安全問題,也稱為數據競爭


三、同步機制的缺陷

  • 使用同步機制(如忙等待)會導致任務死等,浪費 CPU 資源。

  • 應避免使用?while()?循環進行無意義的等待,而應使用阻塞機制讓出 CPU。


四、全局變量在 RTOS 中的存儲位置

問題:全局變量存儲在哪個棧中?

答案:全局變量不屬于任何一個任務的棧。

內存區域劃分:

  1. 代碼區 (Text Segment):存放程序指令。

  2. 全局/靜態數據區 (Data/BSS Segment)

    • 存放全局變量靜態變量

    • 在程序啟動時分配,生命周期貫穿整個程序;

    • 被所有任務和中斷共享。

  3. 堆區 (Heap):動態分配的內存(如?malloc?/?pvPortMalloc)。

  4. 棧區 (Stack)

    • 主棧/中斷棧:用于 ISR 和內核調度;

    • 任務棧:每個任務獨立擁有,用于存放局部變量和上下文。

結論:

全局變量存儲在全局數據區,是共享資源,訪問時需使用臨界區、信號量、互斥鎖等機制進行保護。


五、volatile?關鍵字的作用

問題背景:

在編譯器優化的情況下,可能會將變量緩存在寄存器中,導致多任務環境中讀取到舊值

示例代碼(無?volatile):

c

int g_calc_end = 0;// Writer 任務
void vWriterTask(void *pvParameters) {while(1) {g_calc_end = 1; // 修改全局變量}
}// Reader 任務
void vReaderTask(void *pvParameters) {while(1) {if (g_calc_end == 1) { // 判斷全局變量// 執行操作g_calc_end = 0;}vTaskDelay(1);}
}

問題流程:

  1. Reader 任務第一次讀取?g_calc_end?到寄存器;

  2. 編譯器優化后,后續判斷直接使用寄存器中的值(不再從內存讀取);

  3. Writer 任務修改了內存中的?g_calc_end

  4. Reader 任務仍然使用寄存器中的舊值,導致判斷錯誤。

解決方案:使用?volatile

c

volatile int g_calc_end = 0;

volatile?的作用:

  • 告訴編譯器該變量是“易變的”;

  • 禁止對其進行優化:

    • 每次讀取必須從內存中重新加載;

    • 每次寫入必須立即寫回內存。


六、補充與總結

疏漏補充:

  1. 原子操作:某些架構提供原子指令(如?__atomic_inc),可避免數據競爭;

  2. 臨界區保護:使用開關中斷、調度器鎖、互斥量等方法保護共享資源;

  3. 任務通信機制:除了全局變量,還可使用隊列、事件組、信號量等進行任務間同步與通信;

  4. 內存屏障:在多核系統中,可能需要使用內存屏障指令確保內存訪問順序。

總結圖示:

(見原筆記中的圖片,圖示展示了同步與互斥的機制和資源訪問流程)


七、最佳實踐建議

  1. 盡量避免使用全局變量,優先使用 RTOS 提供的通信機制;

  2. 若必須使用共享資源,務必使用互斥鎖或信號量進行保護;

  3. 對于可能被異步修改的變量,必須使用?volatile?聲明;

  4. 在臨界區中盡量減少操作時間,避免影響系統實時性;

  5. 合理使用任務阻塞機制,避免忙等待浪費 CPU 資源。

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

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

相關文章

Tomcat 啟動流程與類加載機制

Tomcat 啟動流程與類加載機制1. 引言 Tomcat 的啟動不僅僅是簡單的 java -jar 或 catalina.sh start。 它背后包含 Bootstrap 啟動器、Catalina 控制器、Server/Service/Connector/Container 初始化 等關鍵步驟。 另一方面,Tomcat 為了支持 熱部署、不同應用間類隔離…

MTK Linux Charger驅動分析(十二)- mtk_pd_adapter.c

1. 代碼整體分析 mtk_pd_adapter.c(源文件) 主要內容: 該文件實現了MediaTek平臺的USB PD(Power Delivery)適配器驅動,基于Linux內核的電源管理和Type-C端口控制器(TCPC)框架。 它處理PD協議事件,包括PD連接狀態、Type-C狀態、水檢測(WD_STATUS)、Sink VBUS變化等。…

Spring Boot Logback 日志配置詳解:從基礎到分布式追蹤

日志是應用程序不可或缺的組成部分,它不僅能幫助我們調試問題,還能監控系統運行狀態。在 Spring Boot 生態中,Logback 憑借其高性能和靈活性成為首選的日志框架。本文將通過一個實際的 Logback 配置文件,詳細解析其各個組件的功能…

軟件體系結構——后端三層架構

三層架構——Controller、Service、Dao 不僅是對代碼進行的邏輯分層。其真正的本質,是將業務、技術和數據剝離。搞業務的專心做業務,搞技術的專心搞技術,做數據存儲的專心做數據存儲。三方通過接口進行對接,任一部分重構&#xff…

QML學習筆記(一)基本了解和工程配置

前言: 已經從事QT開發幾年了,但對于QML這個東西始終是沒有徹底掌握,一方面實際工作中沒有用到過,其次它的語法對我來說是全新的東西,不像QWidget那一套可以直接在C中去寫。這就是為什么網上都說qml更簡單,我…

SAP HANA Scale-out 04:緩存

結果緩存靜態結果緩存 Vs 動態結果緩存FeatureStatic Result CacheDynamic Result CacheTarget Scenario對復雜視圖(通常是頂層視圖)的查詢頻繁更新的大表(例如ACDOCA)上的聚合查詢Query result非實時數據實時數據ScopeTarget obj…

嘉興禾潤 HTR7216 (S) LED 驅動芯片:特性與應用

在如今智能設備飛速普及的時代,無論是智能家居的氛圍營造、IoT 設備的狀態提示,還是個人消費電子的視覺呈現,都離不開高性能 LED 驅動芯片的支撐。嘉興禾潤推出的 HTR7216 (S) LED 驅動芯片,憑借豐富的功能、精準的控制以及出色的…

Python實現劍龍優化算法 (Stegosaurus Optimization Algorithm, SOA)優化函數(付完整代碼)

Python實現劍龍優化算法 (Stegosaurus Optimization Algorithm, SOA)優化函數(付完整代碼)1.劍龍優化算法介紹劍龍優化算法(Stegosaurus Optimization Algorithm,SOA)是一種受劍龍獨特生理結構和行為模式啟發而設計的元…

分布式拜占庭容錯算法——權益證明(PoS)算法詳解

Java 實現權益證明(PoS)算法詳解 一、PoS 核心機制 #mermaid-svg-Sbj0HU6MjOl1yo5L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sbj0HU6MjOl1yo5L .error-icon{fill:#552222;}#mermaid-s…

【論文閱讀】谷歌:生成式數據優化,只需請求更好的數據

谷歌DeepMind團隊通過Generative Data Refinement(GDR)技術,成功將極端有毒的4chan討論數據轉化為安全且語義豐富的訓練素材,推動了LLM訓練數據凈化的新范式: ? GDR利用預訓練大模型對原始數據進行“重寫”&#xff0…

C++ 多線程實戰 10|C++20 的信號量、閂鎖與屏障

目錄 前言 學習目標 1. 信號量(Semaphore) 示例:限制并發下載任務 2. 閂鎖(Latch) 示例:賽跑 3. 屏障(Barrier) 示例:圖像處理流水線 4. 常見坑與對策 5. 實踐作…

【Java SE】01. 初識Java

1. 認識Java Java是一種優秀的程序設計語言,它具有令人賞心悅目的語法和易于理解的語義。Java還是一個有一系列計算機軟件和規范形成的技術體系,這個技術體系提供了完整的用于軟件開發和跨平臺部署的支持環境,并廣泛應用于嵌入式系統、移動終…

解鎖倉儲智能調度、運輸路徑優化、數據實時追蹤,全功能降本提效的智慧物流開源了

AI 視頻監控平臺:全鏈路協同驅動的智能監控解決方案AI 視頻監控平臺是一款融合高性能功能與輕量化操作的實時算法驅動型視頻監控系統,其核心愿景在于深度破除不同芯片廠商間的技術壁壘,省去冗余重復的適配環節,最終達成芯片、算法…

冒泡排序與選擇排序以及單鏈表與雙鏈表

1. 冒泡排序(Bubble Sort) 1. 原理 冒泡排序是一種 簡單的排序算法,通過 兩兩比較相鄰元素,把較大的元素逐漸 “冒泡” 到數組末尾。 思路: 從數組頭開始,比較相鄰兩個元素。 如果前一個比后一個大&…

Python實現計算點云投影面積

本次我們分享一種基于 Open3D 的快速、穩健方法,用于從激光點云中自動提取“地面”并計算其投影面積。算法先自適應估計地面高程,再將地面點投影至水平面,隨后用凸包或最小外接矩形求取面積。整個流程無需人工干預,單文件即可運行…

AXI4 協議

一、AXI4簡介AXI4(Advanced eXtensible Interface 4)是ARM公司推出的高性能片上總線協議,屬于AMBA(Advanced Microcontroller Bus Architecture)標準的一部分。它專為高帶寬、低延遲的片上通信設計,廣泛應用…

《餓殍:明末千里行》Switch版試玩發布 3月13日發售

使用jQuery的常用方法與返回值分析 jQuery是一個輕量級的JavaScript庫,旨在簡化HTML文檔遍歷和操作、事件處理以及動畫效果的創建。本文將介紹一些常用的jQuery方法及其返回值,幫助開發者更好地理解和運用這一強大的庫。 1. 選擇器方法 jQuery提供了多種…

[特殊字符] 認識用戶手冊用戶手冊(也稱用戶指南、產品手冊)是通過對產品功能的清

一份優秀的用戶手冊能有效降低用戶的使用門檻,提升用戶體驗和工作效率。下面我將為你梳理編寫用戶手冊的核心要點、步驟和技巧。📖 認識用戶手冊用戶手冊(也稱用戶指南、產品手冊)是??通過對產品功能的清晰解釋,為特…

蘋果軟件代碼混淆,iOS混淆、iOS加固、ipa安全與合規取證注意事項(實戰指南)

在移動軟件交付與合規審計中,蘋果軟件代碼混淆已成為保護知識產權與用戶數據的常規手段。但混淆帶來的不僅是逆向難度的提升,也會觸發崩潰取證、符號化(symbolication)、審計合規與法律證據保存等問題。本文從工程與合規雙視角出發…