了解訊號量之前,要先了解臨界資源、同步與互斥的概念
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的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...