信號量:
信號量是IPC結構中的一種,是進程間通信的一種方法,也可以解決同一進程不同線程之間的通信問題。它是用來保證兩個或多個關鍵代碼段不被并發調用,防止多個進程同時對共享資源進行操作。
原理:
在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那么該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。
形象理解:
以一個停車場的運作為例。假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然后放下車攔,剩下的車則必須在入口等待,此后來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知后,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。
在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。
兩種操作:
抽象的來講,信號量的特性如下:信號量是一個非負整數(車位數),所有通過它的線程/進程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處于等待狀態。
1. Wait(等待)
當一個線程調用Wait操作時,它要么得到資源然后將信號量減一,要么一直等下去(指放入阻塞隊列),直到信號量大于等于一時。
2. Release(釋放)
實際上是在信號量上執行加一操作,對應于車輛離開停車場,該操作之所以叫做“釋放”是因為釋放了由信號量守護的資源。
兩個函數:
sem_post函數(函數原型 int sem_post(sem_t *sem);)
作用是給信號量的值加上一個“1”。 當有線程阻塞在這個信號量上時,調用這個函數會使其中一個線程不在阻塞,選擇機制是有線程的調度策略決定的。
sem_wait函數(函數原型 int sem_wait(sem_t * sem);)
它的作用是從信號量的值減去一個“1”,但它永遠會先等待該信號量為一個非零值才開始做減法。
一種使用方法:
可以使用信號量完成類似于傳遞signal的功能:
某一個線程要在一定條件下完成特定功能,由其他多個線程提供條件。此時,其他線程調用sem_post()使信號量加一,本線程調用sem_wait()函數阻塞等待,信號量來了方可退出阻塞。
此種情況本線程只調用sem_wait(),之后不調用sem_post()。
?
原文地址:https://blog.csdn.net/megayangyang/article/details/55662170
?