關(guān)于信號量,一般可以用停車來比喻:
停車場剩余4個(gè)車位,那么即使來了4輛車也能停下。如果此時(shí)來了第5輛車,
那么就有一輛需要等待。
信號量的值就相當(dāng)于剩余車位的數(shù)目,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車,dispatch_semaphore_signal就相當(dāng)于走了一輛車。
停車位的剩余數(shù)目在初始化的時(shí)候就已經(jīng)指明了(dispatch_semaphore_create(long value)),
調(diào)用一次dispatch_semaphore_signal,剩余的車位就增加一個(gè);
調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個(gè);
當(dāng)剩余車位為0時(shí),再來車(即調(diào)用dispatch_semaphore_wait)就只能等待。
有可能同時(shí)有幾輛車等待一個(gè)停車位。有些車主
沒有耐心,給自己設(shè)定了一段等待時(shí)間,這段時(shí)間內(nèi)等不到停車位就走了,如果等到了就開進(jìn)去停車。而有些車主就像把車停在這,所以就一直等下去。
windows核心編程有關(guān)信號量的解釋
當(dāng)前的資源數(shù)量大于0,表示信號量處于觸發(fā)。
等于0,表示資源已經(jīng)耗盡,信號量處于未觸發(fā)的狀態(tài)。
在對信號量調(diào)用等待函數(shù)時(shí),等待函數(shù)會(huì)檢查信號量的當(dāng)前資源計(jì)數(shù),如果大于0(即信號量處于觸發(fā)狀態(tài)),減1后返回讓調(diào)用線程繼續(xù)執(zhí)行。一個(gè)線程可以多次調(diào)用等待函數(shù)來減小信號量。
GCD中
信號量是一個(gè)整形值并且具有一個(gè)初始的計(jì)數(shù)值。
支持兩個(gè)操作:
- 信號等待
- 信號通知
當(dāng)一個(gè)信號量被通知,其計(jì)數(shù)會(huì)增加。
當(dāng)一個(gè)線程在一個(gè)信號量等待時(shí)候,線程會(huì)處于阻塞,直到計(jì)數(shù)器大于0,然后線程會(huì)減少這個(gè)計(jì)數(shù)
GCD提供三個(gè)函數(shù)對semaphore進(jìn)行操作
- dispatch_semaphore_create
創(chuàng)建semaphore,代表信號總量。 - dispatch_semaphore_wait
等待semaphore,當(dāng)信號量總數(shù)少于0,就會(huì)處于等待狀態(tài) - dispatch_semaphore_signal
通知semaphore,信號量+1