C Semaphore 訊號量 鎖 簡單理解

2022-09-18 10:09:20 字數 2048 閱讀 2613

)概念解釋

訊號量就是乙個停車場。

當前值是停車場裡還剩下多少個空車位。

最大值是停車場裡最多能容納多少個車位。

當汽車進入停車場時,首先要在門口排隊(sem_wait),得到進入許可後才能進入。

排隊順序原則上先到先得。

每進一輛車,停車場就少了1個停車位,即訊號量當前值-1。

當前值為0時,停車場停滿了,所有車不得進入統統在門口排隊等。

當一輛車離開後,釋放其所佔據的停車位(sem_post),訊號量當前值+1

訊號量值得到釋放後,如果門口有正在排隊的車,那麼就放進來,每放進來乙個就重複前面的步驟。

例子:semaphore(1, 4):

當前停車場有4個車位。裡面預設已經停了一輛車了。

waitone() 表示乙個車再停車場內等待,車位-1

release(n)表示一輛車離開停車場,車位+1;

當車位為0是。表示已經停滿車。

它與的互斥鎖區別是 互斥鎖:是執行緒間互斥用的,乙個執行緒占用了某乙個共享資源,那麼別的執行緒就無法訪問,直到這個執行緒離開,其他的執行緒才開始可以使用這個共享資源。可以把互斥鎖看成二值訊號量。  

優先順序反轉,是指在使用訊號量時,可能會出現的這樣一種不合理的現象,即:

高優先順序任務被低優先順序任務阻塞,導致高優先順序任務遲遲得不到排程。但其他中等優先順序的任務卻能搶到cpu資源。-- 從現象上來看,好像是中優先順序的任務比高優先順序任務具有更高的優先權。

具體來說:當高優先順序任務正等待訊號量(此訊號量被乙個低優先順序任務擁有著)的時候,乙個介於兩個任務優先之間的中等優先順序任務開始執行——這就會導致乙個高優先順序任務在等待乙個低優先順序任務,而低優先順序任務卻無法執行類似死鎖的情形發生。

semaphore(1, 4):預設執行訊號量之後就可以釋放一條執行緒進入臨界資源。手動設定release的一次最大個數是4條執行緒,臨界區最大的執行緒數是4.當一次釋放的執行緒超過等待的資源數就會報錯

waitone()阻塞執行緒,等燈來

release(n) 同時放行條執行緒進入資源區,最大不能超過初始化設定的maximumcount

close()釋放所有

有10個執行緒,同時只執行4條執行緒,每完成乙個就release乙個,等待中的就補上去

**如下:

該**會正常執行完成,並且釋放所有執行緒,因為初始化話new semaphore(1, 4)時候已經設定預設釋放一條執行緒,這條執行緒執行完成後road.release();又釋放下一條。依次釋放完所有執行緒。

semaphore road = new semaphore(1, 4

);for(int i = 0; i < 10; i++)

",obj);

road.release();

//該執行緒執行完畢,後再釋放乙個執行緒

} ).start(i);

}thread.sleep(

1000

);//該**會正常執行完成,並且釋放說有執行緒,因為初始化話new semaphore(1, 4)

時候已經設定預設釋放一條執行緒,這條執行緒執行完成後road.release();又釋放下一條。依次釋放完所有執行緒。

另外,訊號量是核心物件可以再多個程序中使用。可以給訊號量設定乙個名稱,這個名稱是作業系統可見的,因此,可以使用這些訊號量來協調跨程序邊界的資源使用。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

semaphore2

}}複製**

執行兩個這樣的程式,你講看到這樣的結果,在第二個執行的示例中,會將執行緒阻塞在第三個訊號量

訊號量,互斥鎖

注 摘自 程式設計師的自我修養 相關章節。關鍵字 執行緒同步 原子操作 鎖 二元訊號量 訊號量 互斥量 臨界區 讀寫鎖 條件變數 原子操作 共享資料 全域性變數或堆變數 的自增 操作在多執行緒環境下會出現錯誤是因為這個操作 一條c語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...

訊號量 互斥鎖

訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...

自旋鎖,互斥鎖,訊號量

自旋鎖,互斥鎖,訊號量 樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制 如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖 sleep ...