Linux -- 進程間通信之信號量

多個線程同時訪問一個共享數據,很可能造成惡劣的後果。 爲了保證數據訪問資源的正確性和安全性,需要對線程進行“同步”。

(Linux下所有的執行實體都稱爲任務(task),每個任務類似於單線程的進程,共享了同一個內存空間的多個任務構成了一個進程)


同步即指在一個線程對數據訪問未結束的時候,其他線程不得訪問同一個數據,將對數據的訪問原子化。

*原子操作:

 不可分割,不會被線程調度打斷的操作;

(一個程序在運行的過程中可能被優先級更高的線程中斷,而有些操作是不可中斷的,不然會出現無法還原的後果,這時候操作系統就需要原子操作)


同步最常用的方式是“”,每一個線程訪問數據或資源前首先要獲取鎖,並在訪問結束後釋放鎖;在鎖被佔用時試圖獲取鎖,線程會進入等待,直到鎖重新可用。



二元信號量是最簡單的一種鎖,適合被一個線程獨佔訪問的資源。它只有兩種狀態,佔用和非佔用;當一個線程獲取鎖後,其他線程試圖獲取鎖將進入等待,直到該鎖被釋放。


互斥量類似於二元信號量,資源同時只允許一個線程訪問,不同的是信號量在整個系統中允許任何線程獲取並釋放,即信號量可以被系統中一個線程獲取,然後由另一個線程釋放它;而互斥鎖要求哪個線程獲取互斥量,這個線程就要負責釋放這個鎖,其他線程釋放該互斥量是無效的。

*臨界資源:

 一次僅允許一個進程訪問的資源稱爲臨界資源,通常用互斥量控制臨界資源的訪問





P (測試)/ V(增加) 操作:

對於允許多個線程併發訪問的鎖成爲多元信號量,簡稱信號量,一個初始值爲N的信號量允許N個線程同時訪問,線程訪問資源首先獲取信號量,進行如下操作(P):

* 將信號量的值減1

* 如果信號量的值小於0,則進入等待


訪問完資源後,線程釋放信號量,進行如下操作(V):

* 將信號量的值加1

* 如果信號量的值小於1,喚醒一個等待中的線程



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章