訊號量 實現同步互斥

2021-09-03 02:46:37 字數 2913 閱讀 6714

了解訊號量之前,要先了解臨界資源、同步與互斥的概念

1.臨界資源:在同一時間只能被乙個程序呼叫的資源,也稱互斥資源

2.同步:保證訪問的時序可控性,使呼叫資源的的順序合理。

3.互斥:在程序呼叫臨界資源是,不同程序之間要競爭該資源,那麼乙個程序呼叫了該資源,另乙個程序無法再呼叫該資源的情形就叫互斥!

4.臨界區:**中涉及到了操作臨界資源的**段叫臨界區。

5.原子操作:該操作無法被打斷

6.同步與互斥的作用:使訪問臨界資源時,具有安全性。

1.實質:

具有乙個等待佇列的計數器,也屬於臨界資源的一種,要獲取訊號量資源,則對訊號量進行-1操作,要釋放訊號量資源,則對訊號量資源進行+1操作。

注:訊號量操作是原子操作

2.訊號量實現同步

原理:程序獲取臨界資源之前,要先獲取訊號量資源;

若無訊號量資源,則該程序阻塞等待,進入等待佇列。

若有訊號量資源,則對訊號量進行p(-1)操作,再獲取臨界資源。

當臨界資源+1時,對應的訊號量資源則執行v(+1)操作,然後喚醒在等待佇列中等待獲取臨界資源的程序。

實現**:(**過長,部落格不易展示)

結果展示:

3.訊號量實現互斥

原理:乙個程序獲取了該臨界資源之後,另乙個程序無法再訪問該臨界資源。

實現互斥,採用一元訊號量,即:該訊號量的計數器,只能為0或1。

乙個程序要獲取臨界資源時,先獲取對應的訊號量資源;

當無訊號量資源時,則該程序阻塞等待,進入等待佇列。

當有訊號量資源時,則對該訊號量資源進行p(-1)操作,然後獲取該臨界資源。

當該程序使用完臨界資源時,將釋放訊號量資源(對訊號量資源進行v(+1)操作),然後喚醒等待佇列中的程序。

實現**:(**過長,部落格不易展示)

結果展示:

4.建立訊號量集(訊號量的乙個集合,乙個陣列)

int semget(key_t key, int nsems, int sem***);

key:該訊號量集的識別符號(名字)

nsems:訊號量集中訊號量的個數

sem***:標誌位(ipc_crest|0644)

成功返回該訊號量集的標識碼,失敗返回-1

5.初始化訊號量的計數值

int semctl(int semid, int semnum, int cmd, …[union semun]);

semid:該訊號量集的標識碼

semnum:訊號量集中的訊號量的索引(下標、序號)

cmd:將要採取的動作

…:不定引數,是semun聯合體,用來傳遞給cmd的引數

成功返回0,失敗-1

注:初始值只能設定一次

cmd選項:

setval:設定訊號量集中乙個訊號量的初始計數值,其值是union semun.val的值,此時需要第四個不定引數選項。

setall:設定訊號量集中所有訊號量的初始計數值。

ipc_rmid:用於刪除該訊號量集,不需要不定引數。

getval:用於獲取該訊號量集中乙個訊號量的計數值。

semun聯合體:

6.訪問訊號量資源(對其進行+1/-1操作)

int semop(int semid, struct sembuf sops, unsigned nsops);*

semid:該訊號量集的操作控制代碼

sops:用來操作訊號量進行+1/-1操作的結構體的指標

nsops:訊號量的個數

成功返回0,失敗返回-1

訊號量+1/-1操作的結構體:

7.刪除訊號量集資源

semctl中cmd選項為ipc_rmid,即刪除訊號量集資源。

其刪除實質類似於共享記憶體的刪除,大家可以參考:

8.訊號量集的命令操作

ipcs -s:檢視

ipcrm -s +semid:刪除semid為semid的訊號量集資源

ipcrm -s +key:刪除為key的訊號量集資源

關於程序的其他內容,大家可以訪問主頁!!

請多多指教!!

訊號量的互斥同步

訊號量的互斥同步都是通過pv原語來操作的,我們可以通過註冊兩個訊號量,讓它們在互斥的問題上互動,從而達到同步。通過下面例項就可以很容易理解 include include include include include include define return if fail p if p typ...

互斥量與訊號量(互斥與同步)

互斥量 mutex 互斥量表現互斥現象的資料結構,也被當作二元訊號燈。乙個互斥基本上是乙個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段 並且在共享同步使用的資源。mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於互斥。mutex物件的值,只...

訊號量 互斥量

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