Linux——線程(3)線程同步

一、線程同步的引入

通過上面的搶票系統我們發現,有的線程,進行工作(掛鎖),當其馬上結束工作(解鎖),發現外面有很多線程在排隊等著加鎖執行任務,這個線程解鎖后就立馬給自己加鎖(可以想象成自己能直到解鎖的時間,所以加鎖的優勢比其他線程大),但是如果這個線程本身并沒有做什么工作,就會使工作效率低下,線程饑餓等問題。

為了解決這個問題,我們規定:所有線程等待加鎖必須排隊,加鎖的線程解鎖后必須排在隊尾等待下一次加鎖,這樣就能保證所有線程都可以執行任務。這就是線程同步。

二、條件變量

條件變量與互斥鎖的相關接口幾乎完全相同,在這里就不多介紹語法了。

但也有些新的接口。

我們用一個場景來介紹一下這些接口是怎么用的。

我們現在有一個主線程和若干個新線程(共用一個鎖)

主線程負責派發任務,新線程負責執行(如果不派發就無法執行)

所以,當一個線程拿到鎖進行查看時,如果發現有任務就執行,但如果發現任務還沒派發,就會去某個條件變量那里進行等待(pthread_cond_wait接口),后面的線程也是如此,這里是在條件變量這的等待隊列(先進先出)。在等待過程中就不會一直的申請加鎖而阻止主線程派發任務了。在所有新線程等待的情況下,當主線程加鎖后派發任務后,會通知(喚醒)第一個開始等待的新線程,讓它去加鎖執行任務(pthread_cond_signal接口),同時,主線程也可以一次喚醒多個線程,讓他們去搶奪該資源(pthread_cond_broadcast接口),這便是這些接口的使用方法。

三、生產者消費者模型

對于多線程并發的情況,我們可以用生產者消費者模型來解釋一下。

首先,我們把主線程稱為生產者,可以視為派發任務方,然后多個新線程稱為消費者,視為取得任務并執行任務。在二者之間,有一個橋梁——共享或臨界資源。那么生產者就會對這份資源進行派發任務的行為,其他消費者要執行任務時,并不會直接向生產者詢問索取,而是直接訪問該臨界資源、上鎖并執行。通過這個臨界資源,我們就可以講生產和消費進行解耦了。同時,臨界資源可以作為媒介,當生產者派發任務多時可以間接通知消費者并增加消費者數量,反之則減少。

而在這個模型中,我們需要研究多個生產與多個消費的同步互斥關系。

首先,生產者與生產者之間是互斥的,畢竟從現實角度考慮,我派發了就不允許你派發。

消費者與消費者之間也是互斥的,如果任務很少而線程很多時,就會出現我搶到任務了而別人都沒搶到。

還有就是生產者與消費者,他們是既互斥又同步的,互斥在于,生產者在派發任務時不允許消費者進來槍任務干擾生產者,而消費者在搶任務時也不許生產者發任務干擾。同步在于,生產者派發任務時,雖然無法搶,但消費者們可以進行排隊等待,而對于生產者們也是一樣的。

總結就是:2個角色,3個關系,1個交易場所。

有了這個模型,我們就可以把條件變量的接口來解釋了。

首先

wait就相當于創建該媒介,讓線程在該阻塞隊列中等待。signal就是叫醒排在最前面的一個線程執行,broadcast就是一次喚醒所有在隊列的線程。

至于wait的接口為什么還要把鎖傳進去呢?——在線程進入等待的時候要解鎖!即解鎖與等待是原子性操作。

條件等待是線程間同步的?種手段,如果只有?個線程,條件不滿足,?直等下去都不會滿足, 所以必須要有?個線程通過某些操作,改變共享變量,使原先不滿足的條件變得滿足,并且友好 的通知等待在條件變量上的線程。條件不會無緣無故的突然變得滿足了,必然會牽扯到共享數據的變化。所以一定要用互斥鎖來保護。沒有互斥鎖就無法安全的獲取和修改共享數據。由于解鎖和等待不是原子操作。調用解鎖之后, pthread_cond_wait 之前,如果已經有其他線程獲取到互斥量,摒棄條件滿足,發送了信號,那么 pthread_cond_wait 將錯過這個信 號,可能會導致線程永遠阻塞在這個 pthread_cond_wait 。所以解鎖和等待必須是?個原子操作。

同時,被喚醒的線程也會重新申請鎖。

四、信號量

什么是信號量呢?首先,信號量和信號并沒有關系。

對于一塊公共資源(臨界區),我們可以當作一整份使用,比如我們的阻塞隊列。但有時,我們也可以分成多塊,然后以塊為單位訪問這塊資源,就可以讓多個執行流并發訪問該塊資源了。

首先,信號量是一個計數器,用來表明臨界資源中的資源數目。而我們申請信號量,本質是對臨界資源的預訂(并非等同于使用),只要預訂成功即使不使用,其他線程也無法使用。而我們信號量作為保護公共資源的機制,本身自己也屬于臨界資源,因此申請信號量的操作必須是原子的。此外,如果我們的計數器只有0和1,那不就成為了我們在線程互斥提到的鎖了嗎。

五、有關信號量的環形隊列

在上面的生產者消費者模型,我們的交易場所是阻塞隊列,有了信號量的引入,我們介紹一種新的交易場所模型——基于信號量的環形阻塞隊列(首尾相連)。(為空或為滿,都指向一個位置)

在這個隊列中,任何人訪問此臨界資源,必須先申請信號量!對于生產者來說,在意的是剩余空間,而對于消費者來講在意的是剩余數據。我們介紹一下此隊列的兩種情況

1.生產消費同時訪問同一個位置

如果為空,說明隊列無數據,消費者就需要阻塞等待,讓生產者放入數據。

如果為滿,說明隊列滿數據,生產者就需要阻塞等待,讓消費者取得并拿出數據。這兩種情況都可以保證原子性!體現了互斥同步原則。

2.指向不同位置

此時就有點像追及問題,此時生產者和消費者就可以同時進行訪問臨界資源,直到回到1情況再繼續一方等待。這種情況就滿足了并發原則。

因此,我們要設計兩個信號量分別給生產消費,以讓他們看到臨界資源的使用情況。

六、信號量的相關接口

1.sem_init

第一個參數不說了,第二個是是否設置為線程間共享,默認設置為0即可,第三個是設置信號量的初始值。

2.sem_destroy

3. P操作(申請信號量)

申請失敗就會阻塞

4.V操作(釋放信號量)

提一下,假設我們現在是生產者的視角,我們就需要讓空間信號量先進行P操作,等放入數據后,再讓消費者(數據信號量)進行V操作。

關于P、V操作

P、V本質都是對信號量的操作,P操作就是申請信號量,預訂資源(但如果信號量為負就會阻塞等待,直到有其他資源釋放導致該信號量++,然后把信號量--),V操作是釋放資源以及喚醒其他阻塞等待的線程,如果沒有等待的線程,那么信號量的值會累加。

對于空間信號量(生產)和數據信號量(消費)而言,我們簡述一下大致流程:
當要放入數據時,空間信號量會預訂(P)(如果沒有等待就進行插入操作),然后放完數據后,讓數據信號量進行V(因為插入一個數據后導致數據個數增加,消費者對于這塊空間的可訪問量++)。而消費者進行消費過程正好與之相反。 (我們把信號量看成可訪問資源塊的數量就好理解了)

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

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

相關文章

基于go的簡單管理系統(增刪改查)

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" )var db *sql.DBtype user struct {id intname stringage int }// 建立連接 func initDB() (err error) {dsn : "root:123456tcp(127.0.0.1:3306)/mysqltes…

HTN77A0原理圖提供聚能芯半導體禾潤一級代理技術支持免費送樣

在電源管理需求日益嚴苛的當下,禾潤 HTN77A0 以卓越性能脫穎而出。它不僅適配多種應用場景,還兼具高效節能與穩定輸出,為設備供能帶來革新體驗。 禾潤 HTN77A0 同步降壓變換器,憑借5V~130V 超寬輸入電壓范圍,打破傳統供…

小程序中的頁面跳轉

小程序中的頁面跳轉 在之前網頁的學習中,我們往往采用超鏈接,或者定義方法、函數等方式來實現頁面的跳轉,但是微信小程序中沒有超鏈接,那我們該如何實現呢?微信小程序的頁面跳轉包括兩個,一個是tabBar頁面…

在K8S遷移節點kubelet數據存儲目錄

默認k8s節點kubelet數據目錄在 /var/lib/kubelet,如果在部署前沒有做好規劃,其實默認就存儲在系統盤/分區下了,這樣會導致一個問題,如果數據量過大會導致kubelet服務異常,其次,系統盤下有一些系統服務引用&…

MySQL基礎關鍵_002_DQL(一)

目 錄 一、初始化 二、簡單查詢 1.部分語法規則 2.查詢一個字段 (1)查詢員工編號 (2)查詢員工姓名 3.查詢多個字段 (1)查詢員工編號、姓名 (2)查詢部門編號、名稱、位置 …

阿里云服務遷移實戰: 04-IP 遷移

普通過戶 如資料過戶按量付費EIP所述,如果原賬號是個人賬號,則目標賬號無限制,如果原賬號是企業賬號,則目標賬號必須為相同認證主體的企業賬號。 其主要操作就是,在原賬號發起過戶,在新賬號接收過戶。具體…

安恒安全培訓實習生,CTF方向面試題!

目均模擬真實CTF賽題,需結合動態調試與工具鏈(pwntools/ROPgadget/one_gadget)完成利用。 覆蓋棧、堆、格式化字符串、高級堆利用、沙箱逃逸五大方向,從基礎ROP到House of Apple,逐步提升對抗防護的能力。 題目1&…

【C++QT】Combo Box 組合框控件詳解

文章目錄 一、QComboBox(Combo Box)1. 基本用法2. 特性3. 信號與槽函數 二、QFontComboBox(Font Combo Box)1. 基本用法2. 特性3. 信號與槽函數 三、總結如果這篇文章對你有所幫助,渴望獲得你的一個點贊! 在…

Best Video下載器——全能高清無水印視頻下載工具

在當今短視頻和流媒體盛行的時代,用戶經常遇到想要下載視頻卻受限于平臺限制的情況。無論是收藏喜歡的影視片段、保存有價值的教程,還是進行二次創作,一款高效、免費且支持多平臺的視頻下載工具顯得尤為重要。Best Video下載器正是為此而生&a…

AI音頻核爆!Kimi開源“六邊形戰士”Kimi-Audio,ChatGPT語音版?

音頻處理領域的天花板被撕開了。 剛剛,kimi 發布全新通用音頻基礎模型 Kimi-Audio,這款由月之暗面(Moonshot AI)推出的開源模型,在 24 小時內收獲 3.2 萬星標,不僅以 1.28% 詞錯率刷新語音識別紀錄&#xf…

安裝VMware虛擬機時出現報錯:

如果已在 BIOS/固件設置中禁用 Intel VT-x,或主機自更改此設置后從未重新啟動,則 Intel VT-x 可能被禁用。 1.解決的方法: BIOS 設置要求 為了使 VMware Workstation 支持用戶級別的監控并允許模塊 MonitorMode 成功啟動,需確保…

基于ESP32 S3 + PVDF采集呼吸心率

壓電薄膜可以采集到微動特征,壓阻傳感器可以采集到是否有大重量壓力,利用這個特性實現類似于床帶采集呼吸心率,實現生命體征檢測功能 ESP32 S3 PVDF實現生命體征檢測帶 硬件: ESP32 S3PVDF壓敏壓阻涂鴉傳感器(可選支…

多模態大語言模型arxiv論文略讀(五十)

Pensieve: Retrospect-then-Compare Mitigates Visual Hallucination ?? 論文標題:Pensieve: Retrospect-then-Compare Mitigates Visual Hallucination ?? 論文作者:Dingchen Yang, Bowen Cao, Guang Chen, Changjun Jiang ?? 研究機構: 同濟大學…

智能駕駛新時代:NVIDIA高級輔助駕駛引領未來出行安全

智能駕駛新時代:NVIDIA高級輔助駕駛引領未來出行安全 在全球汽車產業數字化轉型的時代潮流中,高級輔助駕駛技術已逐漸成為推動產業革新的核心動力。作為這一領域的領導者之一,NVIDIA通過其先進的技術解決方案,正在積極塑造未來的…

總結小程序的坑

小程序中的wxss中 background不能使用本地圖片 解決方法: 使用 Base64 編碼(適合小圖片)使用網絡圖片, 網絡圖片需要用https用 image 標簽替代 分包的圖片主包不能使用,這是分包中的圖片資源默認不能被主包或其他分包直…

供應鏈管理-國際結算:本幣互換 / 數字貨幣橋 / 我國在沙特發行美債

一、本幣互換 本幣互換(Local Currency Swap)是指兩國(或地區)的央行(貨幣當局)簽訂協議,約定在一定條件下,任何一方可以一定數量的本幣交換等值的對方貨幣,用于雙邊貿易…

湖北理元理律師事務所:從法律視角看債務優化的合規實踐

在債務糾紛高發的社會背景下,法律服務機構如何通過合規手段幫助債務人實現債務優化,成為公眾關注的議題。湖北理元理律師事務所作為經國家司法局注冊登記的債事服務機構,其服務模式與成果為行業提供了可參考的樣本。 服務框架:法…

免費在Colab運行Qwen3-0.6B——輕量高性能實戰

Qwen一直在默默地接連推出新模型。 每個模型都配備了如此強大的功能和高度量化的規模,讓人無法忽視。 繼今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen團隊現在發布了他們最新的模型系列——Qwen3。 這次他們不是發布一個而是發布了八個不同的模型——參數范圍從6億到235…

【Java】打印運行環境中某個類引用的jar版本路徑

背景 正式環境出現jar版本不匹配問題,不知道正式環境用的哪個jar版本。通過一下可以打印出類調用的jar // 獲取 POIFSFileSystem 類的加載器并打印其來源路徑 ClassLoader classloaderPOIFS org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoade…

Python生活手冊-元組:保險柜與瑞士軍刀

一、元組的本質:數據世界的保險柜 Python元組就像銀行金庫里的??智能保險箱??,一旦存放物品就會自動焊死箱門。當你把結婚戒指和房產證放進保險箱后,任何人都無法替換或破壞這些物品,只能通過特定窗口查看內容。 # 創建家庭…