學習嵌入式的第二十九天-數據結構-(2025.7.16)線程控制:互斥與同步

以下是您提供的文本內容的排版整理版本。我已根據內容主題將其分為幾個主要部分(互斥鎖、信號量、死鎖、IPC進程間通信、管道操作),并使用清晰的結構組織信息:

  • 代碼片段用代碼塊格式(指定語言為C)突出顯示。
  • 函數定義和步驟使用有序列表整理。
  • 關鍵概念用加粗或小標題強調。
  • 整體結構基于邏輯順序優化,確保易讀性,但未修改原始內容含義。

互斥鎖機制

互斥機制確保多線程中對臨界資源的排他性訪問(公共資源)。框架包括定義、初始化、加鎖、解鎖和銷毀步驟。

  1. 定義互斥鎖

    pthread_mutex_t mutex; // 互斥鎖類型變量
    

  2. 初始化鎖

    • 函數:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
      • 功能:初始化已定義的互斥鎖。
      • 參數:
        • mutex:要初始化的互斥鎖指針。
        • attr:初始化屬性值,通常為NULL(表示默認鎖)。
      • 返回值:成功返回0,失敗返回非零值。
  3. 加鎖

    • 函數:int pthread_mutex_lock(pthread_mutex_t *mutex);
      • 功能:對指定代碼加鎖,加鎖后代碼為原子操作(其他線程無法訪問)。
      • 參數:mutex為互斥鎖指針。
      • 返回值:成功返回0,失敗返回非零值。
      • 注意:如果鎖已被占用,則阻塞當前線程。
  4. 解鎖

    • 函數:int pthread_mutex_unlock(pthread_mutex_t *mutex);
      • 功能:解鎖指定互斥鎖。
      • 參數:mutex為互斥鎖指針。
      • 返回值:成功返回0,失敗返回非零值。
      • 注意:加鎖和解鎖通常成對出現。
  5. 銷毀鎖

    • 函數:int pthread_mutex_destroy(pthread_mutex_t *mutex);
      • 功能:銷毀互斥鎖。
      • 參數:mutex為互斥鎖指針。
      • 返回值:成功返回0,失敗返回非零值。
  6. 非阻塞鎖(trylock)

    • 函數:int pthread_mutex_trylock(pthread_mutex_t *mutex);
      • 功能:類似加鎖,但不阻塞。
      • 參數:mutex為互斥鎖指針。
      • 返回值:成功返回0,失敗返回非零值(如EAGAIN)。
    • 注意:互斥鎖控制排他訪問,但不保證次序。

信號量機制(Linux線程同步)

信號量用于線程或進程間同步,分類為:

  • 無名信號量:線程間通信。
  • 有名信號量:進程間通信。

框架包括定義、初始化、PV操作和銷毀。

  1. 定義信號量

    sem_t sem; // 信號量類型變量
    

  2. 初始化信號量

    • 函數:int sem_init(sem_t *sem, int pshared, unsigned int value);
      • 功能:初始化已定義的信號量。
      • 參數:
        • sem:信號量指針。
        • pshared0表示線程間使用,非0表示進程間使用。
        • value:初始值(例如,二值信號量中,0表示阻塞,1表示通過)。
      • 返回值:成功返回0,失敗返回非零值。
  3. PV操作

    • P操作(申請資源):sem_wait(sem_t *sem);(功能:減少信號量值,如果值為0則阻塞)。
    • V操作(釋放資源):sem_post(sem_t *sem);(功能:增加信號量值,喚醒等待線程)。
    • 注意:PV操作確保同步。
  4. 銷毀信號量

    • 函數:int sem_destroy(sem_t *sem);
      • 功能:銷毀信號量。
      • 參數:sem為信號量指針。
      • 返回值:成功返回0,失敗返回非零值。

死鎖原因與必要條件

死鎖產生原因:

  1. 系統資源不足。
  2. 進程運行推進順序不合適。
  3. 資源分配不當。

死鎖必要條件:

  1. 互斥條件:一個資源每次只能被一個進程使用。
  2. 請求與保持條件:進程因請求資源阻塞時,對已獲得資源保持不放。
  3. 不剝奪條件:進程已獲得資源在未使用完前不能被強行剝奪。
  4. 循環等待條件:若干進程形成頭尾相接的循環等待資源關系。

注意:如果資源充足,死鎖可能性低;否則易因爭奪資源發生。


IPC進程間通信分類

IPC(Inter-Process Communicate)分為三大類:

  1. 古老通信方式

    • 無名管道。
    • 有名管道。
    • 信號(唯一異步通信方式)。
  2. IPC對象通信(System V)

    • 消息隊列(較少使用)。
    • 共享內存(最高效方式)。
    • 信號量集。
  3. Socket通信:用于網絡通信。

特例:線程信號使用sem_init(POSIX標準)。


管道操作(有名管道)

管道操作框架:打開、讀寫、關閉、卸載。

  1. 打開有名管道

    • 函數:int open(const char *pathname, int flags);
      • 注意:
        • 管道為半雙工模式,打開方式決定讀寫端。
        • 示例:
          int fd_read = open("./fifo", O_RDONLY); // 固定為讀端
          int fd_write = open("./fifo", O_WRONLY); // 固定為寫端
          

        • 禁止使用O_RDWR(讀寫模式)或O_CREAT(創建選項),管道創建需用mkfifo函數。
  2. 管道讀寫

    • 讀操作:read(fd_read, buff, sizeof(buff));
    • 寫操作:write(fd_write, buff, sizeof(buff));
  3. 關閉管道

    • 函數:close(fd);
  4. 卸載管道

    • 函數:int unlink(const char *pathname);
      • 功能:移除管道文件。

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

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

相關文章

COZE官方文檔基礎知識解讀第六期 ——數據庫和知識庫

一,一鍵直連數據上傳,存儲,使用 火山方舟的數據庫和知識庫的核心,都是基于開源的數據庫產品(mysql,向量數據庫等),將數據庫交互的邏輯封裝在后端,與前端做耦合&#xff0…

生產環境使用云服務器(centOS)部署和使用MongoDB

部署MongoDB流程1. ?安裝MongoDB?版本選擇建議?CentOS 7?:推薦MongoDB 4.4.x(兼容性好)?CentOS 8/9?:建議最新穩定版(如6.0),需單獨安裝mongodb-database-tools安裝步驟1.添加官方倉庫# 添…

思博倫第二到三層測試儀(打流儀)TestCenter 2U硬件安裝及機箱加電_雙極未來

(1)安裝板卡:上圖中共 4 個紅色線框,上邊兩個紅色線條框住的是機箱的左右兩側導軌,下邊兩條紅色 線條框住的是板卡拉手條(用于承載板卡PCB的金屬板)左右兩邊的邊沿。 安裝時將拉手條兩邊的邊沿與…

【華為】筆試真題訓練_20250611

本篇博客旨在記錄自已的筆試刷題的練習,里面注有詳細的代碼注釋以及和個人的思路想法,希望可以給同道之人些許幫助。本人也是小白,水平有限,如果文章中有什么錯誤或遺漏之處,望各位可以在評論區指正出來,各…

新浪微博APP v14.5.0:連接世界的社交媒體平臺

新浪微博APP 是一款廣受歡迎的社交媒體應用程序,憑借其強大的功能和豐富的社交生態,成為用戶獲取信息、表達觀點、互動交流的重要平臺。最新版 v14.5.0 內置了微博助手 v2.3.0,進一步提升了用戶體驗和功能多樣性。 軟件功能 1. 發布微博 用…

靜態枚舉返回(簡單實現字典功能)

枚舉緩存策略的實現與應用 通過靜態Map緩存枚舉類的Class對象&#xff0c;避免每次請求時重復反射加載。核心實現是一個包含枚舉類名與對應Class映射的Registry類&#xff1a; public class EnumRegistry {private static final Map<String, Class<?>> ENUM_MAP …

深分頁性能問題分析與優化實踐

在日常測試工作中&#xff0c;我們經常會遇到分頁查詢接口&#xff0c;例如&#xff1a; GET /product/search?keyword&pageNum1&pageSize10乍看之下&#xff0c;這樣的分頁接口似乎并無性能問題&#xff0c;響應時間也很快。但在一次性能壓測中&#xff0c;我們復現了…

LeetCode——1957. 刪除字符使字符串變好

通過萬歲&#xff01;&#xff01;&#xff01; 題目&#xff1a;給你一個字符串&#xff0c;然后讓你刪除幾個字符串&#xff0c;讓他變成好串&#xff0c;好串的定義就是不要出現連續的3個一樣的字符。思路&#xff1a;首先就是要遍歷字符串。我們將要返回的字符串定義為ret&…

Aerospike與Redis深度對比:從架構到性能的全方位解析

在高性能鍵值存儲領域&#xff0c;Aerospike與Redis是兩款備受關注的產品。Redis以其極致的單機性能和豐富的數據結構成為主流選擇&#xff0c;而Aerospike則憑借分布式原生設計和混合存儲架構在大規模場景中嶄露頭角。本文將從架構設計、數據模型、性能表現、擴展性等核心維度…

Linux命令速查手冊

一、命令格式與輔助工具類別符號/命令示例說明基本格式commandls -a /home命令 選項 參數管道符ls -lless重定向>df -h > disk_usage.txt覆蓋寫入文件>>echo "New" >> notes.txt追加寫入文件2>ls non_exist 2> error.txt錯誤輸出重定向快捷…

net-snmp添加自定義mib樹

首先我們把前面mib2c生成的文件修改 下面重新做了個簡單點的MIB樹 -- -- -- MIB generated by MG-SOFT Visual MIB Builder Version 6.0 Build 88 -- Saturday, July 26, 2025 at 09:24:54 --ARHANGELSK-GLOBAL-REG DEFINITIONS :: BEGINIMPORTSenterprises, OBJECT-TYPE, M…

【動態規劃-斐波那契數列模型】理解動態規劃:斐波那契數列的遞推模型

算法相關知識點可以通過點擊以下鏈接進行學習一起加油&#xff01;動態規劃是一種解決最優化問題的強大技術&#xff0c;通過將問題分解為子問題并逐步求解來實現高效計算。斐波那契數列是動態規劃中經典的應用之一&#xff0c;其遞推關系非常適合用動態規劃進行優化。通過動態…

微信小程序 自定義帶圖片彈窗

1. 微信小程序 自定義帶圖片彈窗1.1. 實現思路使用官方組件實現圖片模態彈窗。首先找到官方文檔&#xff1a;?顯示模態彈窗的API wx.showModal(OBJECT)wx.showModal參數介紹發現并沒有設置圖片的參數&#xff0c;但是這是一個API&#xff0c;但是組件呢&#xff1f;我并沒有在…

私有化大模型架構解決方案構建指南

內容概要本指南旨在為企業提供私有化大模型架構解決方案的全面構建路徑&#xff0c;幫助其在保障數據隱私的同時提升業務效率。我們將系統解析關鍵環節&#xff0c;包括安全部署策略設計、模型訓練核心技術、持續優化機制構建以及知識管理實踐路徑。此外&#xff0c;指南還涵蓋…

面試150 查找和最小的K對數字

思路1 超時法&#xff1a;通過兩個循環記錄三元組[num1,num2,num1num2]然后通過num1num2從小到大進行排序&#xff0c;然后返回前K個對數中的前兩個數即可。 class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:if n…

vscode目錄,右鍵菜單加入用VSCode打開文件和文件夾(快速解決)(含刪除)(腳本)

1.創建文本文件 在桌面右鍵單擊&#xff0c;選擇“新建” > “文本文檔”&#xff0c;將其命名為“vscode.txt”2.復制代碼內容3.修改文件擴展名 右鍵單擊“vscode.txt”文件&#xff0c;選擇“重命名”&#xff0c;將文件擴展名從.txt改為.reg&#xff0c;使其成為“vscode…

Chart.js 柱形圖詳解

Chart.js 柱形圖詳解 引言 在數據可視化領域&#xff0c;柱形圖是一種非常常見的圖表類型&#xff0c;它能夠直觀地展示不同類別或組的數據之間的比較。Chart.js 是一個基于 HTML5 Canvas 的開源庫&#xff0c;它提供了一系列的圖表繪制功能&#xff0c;其中包括柱形圖。本文將…

沉浸式文旅新玩法-基于4D GS技術的真人數字人賦能VR體驗升級

線下沉浸式劇場與 LBE VR 相結合&#xff0c;會碰撞出什么樣的火花&#xff1f;本次 PICO 視頻、東方演藝集團與火山引擎一起&#xff0c;將沉浸式演出《只此周莊》的部分場景復刻到了 VR 世界&#xff0c;讓用戶在虛擬的古代周莊夜市里&#xff0c;體驗了古老的故事以及精彩紛…

C程序內存布局詳解

C程序內存布局詳解 1. 內存布局概述 C程序在內存中分為以下幾個主要區域&#xff08;從低地址到高地址&#xff09;&#xff1a; 代碼段&#xff08;.text&#xff09;只讀數據段&#xff08;.rodata&#xff09;初始化數據段&#xff08;.data&#xff09;未初始化數據段&…

新手向:Git下載全攻略

Git 的安裝與重要性在現代軟件開發中&#xff0c;版本控制是必不可少的工具&#xff0c;而 Git 是目前最流行的分布式版本控制系統。無論是個人開發者還是大型團隊&#xff0c;Git 都能高效管理代碼變更&#xff0c;確保項目歷史清晰可追溯。安裝 Git 是開發者入門的第一步&…