關(guān)于信號量杰扫,一般可以用停車來比喻:
停車場剩余4個車位,那么即使來了4輛車也能停下吩屹。如果此時來了第5輛車跪另,
那么就有一輛需要等待。
信號量的值就相當(dāng)于剩余車位的數(shù)目煤搜,dispatch_semaphore_wait函數(shù)就相當(dāng)于來了一輛車免绿,dispatch_semaphore_signal就相當(dāng)于走了一輛車。
停車位的剩余數(shù)目在初始化的時候就已經(jīng)指明了(dispatch_semaphore_create(long value))擦盾,
調(diào)用一次dispatch_semaphore_signal嘲驾,剩余的車位就增加一個;
調(diào)用一次dispatch_semaphore_wait剩余車位就減少一個迹卢;
當(dāng)剩余車位為0時辽故,再來車(即調(diào)用dispatch_semaphore_wait)就只能等待。
有可能同時有幾輛車等待一個停車位腐碱。有些車主
沒有耐心誊垢,給自己設(shè)定了一段等待時間,這段時間內(nèi)等不到停車位就走了症见,如果等到了就開進去停車喂走。而有些車主就像把車停在這,所以就一直等下去筒饰。
windows核心編程有關(guān)信號量的解釋
當(dāng)前的資源數(shù)量大于0缴啡,表示信號量處于觸發(fā)。
等于0瓷们,表示資源已經(jīng)耗盡业栅,信號量處于未觸發(fā)的狀態(tài)秒咐。
在對信號量調(diào)用等待函數(shù)時,等待函數(shù)會檢查信號量的當(dāng)前資源計數(shù)碘裕,如果大于0(即信號量處于觸發(fā)狀態(tài))携取,減1后返回讓調(diào)用線程繼續(xù)執(zhí)行。一個線程可以多次調(diào)用等待函數(shù)來減小信號量帮孔。
GCD中
信號量是一個整形值并且具有一個初始的計數(shù)值雷滋。
支持兩個操作:
- 信號等待
- 信號通知
當(dāng)一個信號量被通知,其計數(shù)會增加文兢。
當(dāng)一個線程在一個信號量等待時候晤斩,線程會處于阻塞,直到計數(shù)器大于0姆坚,然后線程會減少這個計數(shù)
GCD提供三個函數(shù)對semaphore進行操作
- dispatch_semaphore_create
創(chuàng)建semaphore,代表信號總量澳泵。 - dispatch_semaphore_wait
等待semaphore,當(dāng)信號量總數(shù)少于0兼呵,就會處于等待狀態(tài) - dispatch_semaphore_signal
通知semaphore兔辅,信號量+1