摘自 原文鏈接
dispatch_semaphore是GCD用來(lái)同步的一種方式腊脱,與他相關(guān)的共有三個(gè)函數(shù)翠勉,分別是
dispatch_semaphore_create姑丑,dispatch_semaphore_signal懈万,dispatch_semaphore_wait嘁灯。
下面我們逐一介紹三個(gè)函數(shù):
(1)dispatch_semaphore_create的聲明為:
dispatch_semaphore_t dispatch_semaphore_create(long value);
傳入的參數(shù)為long泻蚊,輸出一個(gè)dispatch_semaphore_t類(lèi)型且值為value的信號(hào)量。
值得注意的是丑婿,這里的傳入的參數(shù)value必須大于或等于0性雄,否則dispatch_semaphore_create會(huì)返回NULL没卸。
(關(guān)于信號(hào)量秒旋,我就不在這里累述了约计,網(wǎng)上很多介紹這個(gè)的。我們這里主要講一下dispatch_semaphore這三個(gè)函數(shù)的用法)迁筛。
(2)dispatch_semaphore_signal的聲明為: long dispatch_semaphore_signal(dispatch_semaphore_t dsema)
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值加1
(3) dispatch_semaphore_wait的聲明為:
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout)煤蚌;
這個(gè)函數(shù)會(huì)使傳入的信號(hào)量dsema的值減1;
這個(gè)函數(shù)的作用是這樣的细卧,如果dsema信號(hào)量的值大于0尉桩,該函數(shù)所處線(xiàn)程就繼續(xù)執(zhí)行下面的語(yǔ)句,并且將信號(hào)量的值減1贪庙;
如果desema的值為0蜘犁,那么這個(gè)函數(shù)就阻塞當(dāng)前線(xiàn)程等待timeout(注意timeout的類(lèi)型為dispatch_time_t,
不能直接傳入整形或float型數(shù))止邮,如果等待的期間desema的值被dispatch_semaphore_signal函數(shù)加1了这橙,
且該函數(shù)(即dispatch_semaphore_wait)所處線(xiàn)程獲得了信號(hào)量,那么就繼續(xù)向下執(zhí)行并將信號(hào)量減1导披。
如果等待期間沒(méi)有獲取到信號(hào)量或者信號(hào)量的值一直為0屈扎,那么等到timeout時(shí),其所處線(xiàn)程自動(dòng)執(zhí)行其后語(yǔ)句盛卡。
(4)dispatch_semaphore_signal的返回值為long類(lèi)型助隧,當(dāng)返回值為0時(shí)表示當(dāng)前并沒(méi)有線(xiàn)程等待其處理的信號(hào)量,其處理的信號(hào)量的值加1即可滑沧。當(dāng)返回值不為0時(shí)并村,表示其當(dāng)前有(一個(gè)或多個(gè))線(xiàn)程等待其處理的信號(hào)量,并且該函數(shù)喚醒了一個(gè)等待的線(xiàn)程(當(dāng)線(xiàn)程有優(yōu)先級(jí)時(shí)滓技,喚醒優(yōu)先級(jí)最高的線(xiàn)程哩牍;否則隨機(jī)喚醒)。
dispatch_semaphore_wait的返回值也為long型令漂。當(dāng)其返回0時(shí)表示在timeout之前膝昆,該函數(shù)所處的線(xiàn)程被成功喚醒.當(dāng)其返回不為0時(shí),表示timeout發(fā)生叠必。
(5)在設(shè)置timeout時(shí)荚孵,比較有用的兩個(gè)宏:DISPATCH_TIME_NOW 和 DISPATCH_TIME_FOREVER。
DISPATCH_TIME_NOW 表示當(dāng)前纬朝;
DISPATCH_TIME_FOREVER 表示遙遠(yuǎn)的未來(lái)收叶;
一般可以直接設(shè)置timeout為這兩個(gè)宏其中的一個(gè),或者自己創(chuàng)建一個(gè)dispatch_time_t類(lèi)型的變量共苛。
創(chuàng)建dispatch_time_t類(lèi)型的變量有兩種方法判没,dispatch_time和dispatch_walltime蜓萄。
利用創(chuàng)建dispatch_time創(chuàng)建dispatch_time_t類(lèi)型變量的時(shí)候一般也會(huì)用到這兩個(gè)變量。
dispatch_time的聲明如下:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta)澄峰;其參數(shù)when需傳入一個(gè)dispatch_time_t類(lèi)型的變量嫉沽,和一個(gè)delta值。表示when加delta時(shí)間就是timeout的時(shí)間.
例如:dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW, 110001000*1000);表示當(dāng)前時(shí)間向后延時(shí)一秒為timeout的時(shí)間.
(6)關(guān)于信號(hào)量俏竞,一般可以用停車(chē)來(lái)比喻绸硕。
停車(chē)場(chǎng)剩余4個(gè)車(chē)位,那么即使同時(shí)來(lái)了四輛車(chē)也能停的下胞此。如果此時(shí)來(lái)了五輛車(chē)臣咖,那么就有一輛需要等待跃捣。
信號(hào)量的值就相當(dāng)于剩余車(chē)位的數(shù)目漱牵,dispatch_semaphore_wait函數(shù)就相當(dāng)于來(lái)了一輛車(chē),dispatch_semaphore_signal
就相當(dāng)于走了一輛車(chē)疚漆。停車(chē)位的剩余數(shù)目在初始化的時(shí)候就已經(jīng)指明了(dispatch_semaphore_create(long value)),調(diào)用一次dispatch_semaphore_signal酣胀,剩余的車(chē)位就增加一個(gè);調(diào)用一次dispatch_semaphore_wait剩余車(chē)位就減少一個(gè)娶聘;
當(dāng)剩余車(chē)位為0時(shí)闻镶,再來(lái)車(chē)(即調(diào)用dispatch_semaphore_wait)就只能等待。有可能同時(shí)有幾輛車(chē)等待一個(gè)停車(chē)位丸升。有些車(chē)主沒(méi)有耐心铆农,給自己設(shè)定了一段等待時(shí)間,這段時(shí)間內(nèi)等不到停車(chē)位就走了狡耻,如果等到了就開(kāi)進(jìn)去停車(chē)墩剖。而有些車(chē)主就像把車(chē)停在這,
所以就一直等下去夷狰。