Linux軟件編程:線程間通信

目錄

一、線程間通信基礎

1. 概念

2. 通信基礎:共享空間

二、互斥鎖(Mutex)

1. 概念

2. 使用流程

3. 函數接口

三、死鎖

1. 概念

2. 死鎖產生的 4 個必要條件

3. 避免死鎖的方法

四、信號量(Semaphore)

1. 概念

2. 函數接口

3. 應用場景

一、線程間通信基礎

1. 概念

線程間通信指多個線程之間傳遞信息的過程,是多線程協作完成任務的核心機制

2. 通信基礎:共享空間

同一進程中的多個線程共享以下資源,這是線程間通信的基礎:

  • 文本段(代碼區)
  • 數據段(全局變量、靜態變量等)
  • 堆區(動態分配的內存空間)

注意:線程獨享棧區(默認 8M),棧區數據不共享;因此線程間通信主要依賴共享的全局變量、堆區數據等

采用全局變量的原因:

  • 進程是操作系統資源分配的最小單元
  • 每個進程空間獨立的,包含文本段+數據段(全局變量)+系統數據段
  • 一個進程中的多個線程獨享棧空間,文本段、數據段、堆區進程多線程共享

同一進程的線程共享全局變量、靜態變量、堆區數據(malloc 分配),但局部變量(棧區)不共享;因此線程間通信需通過共享變量,避免使用棧區數據

  • 多線程同時操作共享空間會引發資源競爭,需要加上互斥鎖解決資源競爭問題

二、互斥鎖(Mutex)

1. 概念

  • 互斥鎖是解決多線程資源競爭的核心機制,可視為一種 "獨占性資源"
  • 特性:同一時間只能有一個線程獲得鎖,加鎖期間其他線程需等待解鎖后才能再次加鎖
  • 臨界區:加鎖和解鎖之間的代碼段,即被互斥鎖保護的共享資源操作代碼
  • 只能防止多個線程對資源的競爭,不能決定代碼的先后執行順序
  • 原子操作:CPU 執行加鎖 / 解鎖操作時無法切換任務,保證操作的不可分割性

2. 使用流程

1. 定義互斥鎖(全局變量)
2. 對鎖初始化
3. 操作全局資源前先加鎖
4. 如果加鎖成功則完成對全局資源操作
5. 如果加鎖失敗則表示有人占用資源,必須等待其余人釋放鎖資源才能加鎖成功
6. 直到加鎖成功使用該全局資源

3. 函數接口

函數名原型功能參數說明返回值
pthread_mutex_initint pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr)初始化互斥鎖

-?mutex

互斥鎖變量地址
-?attr

鎖屬性(默認 NULL,使用默認屬性)

成功返回 0

失敗返回 - 1

pthread_mutex_lockint pthread_mutex_lock(pthread_mutex_t *mutex)互斥鎖加鎖

mutex

互斥鎖變量地址

成功返回 0

失敗返回 - 1(若鎖已被占用,會阻塞等待)

pthread_mutex_unlockint pthread_mutex_unlock(pthread_mutex_t *mutex)互斥鎖解鎖

mutex

互斥鎖變量地址

成功返回 0

失敗返回 - 1

pthread_mutex_destroyint pthread_mutex_destroy(pthread_mutex_t *mutex)銷毀互斥鎖

mutex

互斥鎖變量地址

成功返回 0

失敗返回 - 1

三、死鎖

1. 概念

多線程因加鎖 / 解鎖順序錯誤,導致線程相互等待對方釋放鎖資源,程序無法繼續執行的狀態。

2. 死鎖產生的 4 個必要條件

條件說明
互斥條件資源(如鎖)只能被一個線程占用
不可剝奪條件線程占用的資源不能被強制剝奪
請求保持條件線程持有部分資源,同時請求其他資源
循環等待條件線程間形成資源請求循環(如線程 1 等待線程 2 的鎖,線程 2 等待線程 1 的鎖)

3. 避免死鎖的方法

  1. 保持加鎖順序一致:所有線程按固定順序加鎖(如先鎖 A 再鎖 B)
  2. 使用非阻塞加鎖:用pthread_mutex_trylock(嘗試加鎖,失敗時不阻塞,返回錯誤碼)替代pthread_mutex_lock
  3. 限時加鎖:設置加鎖超時時間,超時后釋放已持有的鎖

四、信號量(Semaphore)

1. 概念

  1. 信號量是一種資源
  2. 信號量只能完成四種操作:初始化、銷毀、申請、釋放
  3. 如果信號量資源數為0,申請資源會阻塞等待,直到占用資源的任務釋放資源,資源數不為0才能申請到資源并繼續向下執行
  4. 釋放資源不會阻塞

2. 函數接口

函數名原型功能參數說明返回值
sem_initint sem_init(sem_t *sem, int pshared, unsigned int value)初始化信號量

-?sem

信號量變量地址
-?pshared

0 表示線程間共享,非 0 表示進程間共享
-?value

初始資源數量

成功返回 0

失敗返回 - 1

sem_destroyint sem_destroy(sem_t *sem)銷毀信號量

sem

信號量變量地址

成功返回 0

失敗返回 - 1

sem_waitint sem_wait(sem_t *sem)申請信號量(P 操作)

sem

信號量變量地址

成功返回 0(資源數 - 1)

失敗返回 - 1;資源數為 0 時阻塞

sem_postint sem_post(sem_t *sem)釋放信號量(V 操作)

sem

信號量變量地址

成功返回 0(資源數 + 1)

失敗返回 - 1

注意:
  • 申請信號量會讓信號量資源數-1
  • 如果信號量資源數為0,則會阻塞等待,直到有任務釋放資源,才能拿到資源并繼續向下 執行

3. 應用場景

  • 控制并發訪問數量(如限制同時訪問共享內存的線程數)
  • 實現線程間的同步(如生產者 - 消費者模型中控制數據讀寫順序)

注意:

  1. 互斥鎖與信號量的區別
  • 互斥鎖:用于 "獨占" 資源(資源數固定為 1),解決資源競爭
  • 信號量:用于 "計數" 資源(資源數可自定義),控制并發數量或同步

? ? ?2.臨界區設計原則

  • 臨界區代碼應盡可能精簡,僅包含對共享資源的操作,減少線程等待時間,提高效率

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

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

相關文章

【學習筆記】JVM GC回收機制

1.三種基本的垃圾回收算法 1>標記-清除法 ①先將從樹根開始,可以到達的對象標記為可達(JVM中的對象們存儲為一顆樹) ②將沒有標記的對象清除掉 缺點:會產生大量內存碎片 2>復制算法(新生代) ①先將a區…

軟件的終極:為70億人編寫70億個不同的軟件

這是個腦洞大開的想法。昨天晚上,我在用Claude code幫我寫一個小工具,用來管理我本地那些亂七八糟的文檔。寫著寫著,突然意識到一個問題:這個工具完全是按照我的工作習慣定制的——我喜歡用Markdown,習慣把TODO放在文件…

LakeHouse--湖倉一體架構

大家可能發現了,近些年湖倉一體數據架構被提及的頻率越來越高。各家大廠也有湖倉一體架構的實踐,也有很多公開分享。 那什么是湖倉一體?為什么出現了湖倉一體架構,換言之,它解決了以前數據倉庫、數據湖+數倉兩層架構所不能解決的什么問題? 本文會從數倉、數據湖依次介紹…

基于FPGA的實時圖像處理系統(1)——SDRAM回環測試

SDRAM回環設計 文章目錄SDRAM回環設計一、SDRAM簡介1、引腳2、內部結構框圖3、操作指令二、系統設計三、實現流程1、SDRAM接口2、FIFO設置3、內部SDRAM的控制模塊4、其他四、實現效果五、總結六、代碼1、top2、sdram_top3、sdram_ctrl一、SDRAM簡介 SDRAM英文全稱“Synchronou…

一鍵檢測接口是否存活:用 Python/Shell 寫個輕量級監控腳本

網羅開發(小紅書、快手、視頻號同名)大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括iOS、前端、Harmony OS、Java、Python等方…

優秀工具包-Hutool工具詳解

優秀工具包-Hutool工具詳解 課程概述 Hutool簡介 定位: 小而全的Java工具庫,簡化開發流程。對文件、流、加密解密、轉碼、正則、線程、XML等JDK方法進行封裝。 核心優勢:零依賴、高性能、中文網頁完善。 應用場景:Web開發、數…

《深度解構:構建瀏覽器端Redis控制臺的WebSocket協議核心技術》

Redis作為高性能的內存數據庫,其原生客戶端多依賴命令行或桌面應用,而瀏覽器端控制臺的缺失,成為制約Web化管理的關鍵瓶頸,WebSocket協議的出現,打破了HTTP協議單向通信的局限,為瀏覽器與Redis服務之間建立持久、雙向的實時連接提供了可能。本文將從協議本質、交互邏輯、…

Pushgateway安裝和部署,以及對應Prometheus調整

目錄Pushgateway簡介安裝驗證Prometheus的配置:其它命令Pushgateway簡介 Pushgateway 是 Prometheus 生態系統中的一個組件。主要特點是推送而非拉取:Prometheus 默認采用拉取(pull)模式收集指標,但 Pushgateway 允許…

JAVA面試匯總(四)JVM(一)

久違的重新寫了一篇面試匯總的,關于JVM的一篇,一共三篇,今天寫了第一篇,繼續重新學習,重新卷起來,come on baby 1.什么情況下會觸發類的初始化? (1)首先是類未被初始化時…

Agent中的memory

rag系列文章目錄 文章目錄rag系列文章目錄前言一、Memory機制作用二、memory分類三、langgraph實踐總結前言 眾所周知,大模型是無狀態的。但是基于大模型的agent一般是有狀態的,也就是它有記憶功能。在AI Agent框架中,Memory機制是核心組件之…

AI與IT從業者的未來:替代焦慮還是協作革命?

??引言:技術滲透與核心命題??2025年,人工智能技術已從實驗室走向產業核心。國務院《關于深入實施“人工智能”行動的意見》推動AI在醫療、制造、金融等領域的規模化落地,全球AI應用用戶規模突破2.3億,生成式AI工具滲透率達16.…

手機版碰一碰發視頻系統批量剪輯功能開發,支持OEM貼牌

引言在當今短視頻盛行的時代,視頻內容的快速生產與分享變得愈發重要。手機版碰一碰發視頻系統,借助 NFC 等近場通信技術,實現了便捷的數據交互與視頻分享,而在此基礎上集成的批量剪輯功能,更是為內容創作者和商家帶來了…

Spring AMQP如何通過配置文件避免硬編碼實現解耦

在使用Spring AMQP基于注解聲明監聽者時,可通過抽取常量來避免硬編碼:RabbitListener(bindings QueueBinding(exchange Exchange(MQConstant.USER_EXCHANGE),value Queue(MQConstant.USER_QUEUE),key MQConstant.USER_REDIS_BINDING))public void de…

解決zabbix圖片中文亂碼

要把 Zabbix 前端字體替換為 simkai.ttf(楷體,解決亂碼常用),按以下步驟操作:1. 確認 simkai.ttf 路徑 先找到系統里 simkai.ttf 字體文件,若沒有,可從 Windows 系統(C:\Windows\Fon…

實例分割-動手學計算機視覺13

介紹 實例分割(instance segmentation)的目的是從圖像中分割出每個目標實例的掩模(mask)。與語義分割相比,實例分割不但要區分不同的類別,還要區分出同一種類別下的不同目標實例。如圖13-1所示 語義分割的結果中,不同的羊對應的標簽是一樣的…

水環境遙感分析!R語言編程+多源遙感數據預處理;水體指數計算、水深回歸分析、水溫SVM預測、水質神經網絡建模及科研級可視化制圖

系統性地整合R語言編程、遙感數據處理及機器學習建模,涵蓋水線提取(水體指數與閾值法)、水深反演(多元回歸)、水溫預測(支持向量機)、水質評估(神經網絡)等核心內容&…

微信公眾號/小程序百萬級OpenID自動化獲取工具

摘要 本報告詳細闡述了微信用戶列表數據獲取與處理工具的設計思路,包括分頁處理機制、頻率控制策略、斷點續傳功能和分布式存儲方案。針對微信API調用限制和用戶數據規模特點,該工具旨在高效、安全地獲取和存儲微信用戶列表數據,同時嚴格遵守微信API調用頻率限制,確保系統…

物聯網系統中傳感器到網關到物聯網平臺的傳輸路徑、協議、原理、用途與架構詳解

摘要物聯網(IoT)系統通過傳感器、網關和物聯網平臺實現數據的采集、傳輸、處理和應用。本文詳細分析了傳感器到網關再到物聯網平臺的傳輸路徑,涵蓋直接連接、網關中繼、邊緣計算、多級網關和混合路徑五種方式;介紹了短距離&#x…

SpringBoot自動注入配置類初步實現

一.SpringBoot自動裝配SpringBoot 的 自動裝配(Auto-Configuration) 是它的核心特性之一,它讓開發者可以 "開箱即用",避免手動配置大量的 XML 或 Java Config。它的核心思想是:"約定優于配置"&…

直播預告|鴻蒙生態中的AI新玩法

想知道鴻蒙生態里 AI 能玩出啥新花樣? 8 月 14 日(周四)20:00 ,「開發者?面對面 堅果派特輯 —— 鴻蒙生態中的 AI 新玩法」直播來襲! 🔍 直播亮點搶先看 AI賦能鴻蒙產品開發:將分享如何利用AI…