bash實現互斥 訊號量的方法

2021-05-23 18:23:46 字數 954 閱讀 8561

【通過fifo實現訊號量】

利用fifo的block-reading實現。

【通過flock+檔案實現互斥和訊號量

假設worker.sh為處理指令碼(下同)

1、在排程worker.sh時(也就是worker.sh的外層)互斥,可以簡單的通過flock實現。

優點:將worker的邏輯與鎖過程解耦

缺點:需要統一的入口排程worker.sh

2、在worker.sh內實現互斥

檔案lockfile.lock記錄當前的鎖curlock(唯一表示乙個鎖的特性值,如pid),通過flock實現lockfile.lock的互斥修改。

加鎖過程:

1)flock讀取當前鎖curlock,curlock為空,記錄特性鎖到所檔案lockfile.lock,否則重複讀取當前鎖curlock並驗證的過程。

2)鎖獲取後即返回狀態;鎖超時或失敗則可以相應的定義返回。

解鎖過程:

與加鎖過程類似,只是進行相反的過程。

簡單的例項如下:

上面的例子很簡單,需要處理的問題還有很多:

1)例子中鎖是持久的、強制的,lock、unlock出現不匹配的情況下,就是杯具,因此要考慮到lock之後沒有unlock的情況。比如,通過限制鎖的最長有效期(可以簡單的通過lockfile.lock的mtime判斷),過期的鎖等價於free

2)效能消耗

3)try_lock實現

3、實現訊號量

基於上面的例子,實現訊號兩就比較簡單了,之間將寫入所檔案的內容置為當前的訊號數量,每獲取乙個訊號就將檔案中的數字減小1;釋放訊號量則相反。

訊號量 互斥量

lonelycatcher if only as first.來自 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...

POSIX訊號量實現互斥

採用posix訊號量實現互斥原語,實現執行緒間同步 採用訊號量實現互斥原語 include include include include include include include include include define maxnum 10000 用乙個結構體封裝命名訊號量 struct...

訊號量 實現同步互斥

了解訊號量之前,要先了解臨界資源 同步與互斥的概念 1.臨界資源 在同一時間只能被乙個程序呼叫的資源,也稱互斥資源。2.同步 保證訪問的時序可控性,使呼叫資源的的順序合理。3.互斥 在程序呼叫臨界資源是,不同程序之間要競爭該資源,那麼乙個程序呼叫了該資源,另乙個程序無法再呼叫該資源的情形就叫互斥!4...