GCD-(信號(hào)量)

摘自 原文鏈接

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ē)停在這,
  所以就一直等下去夷狰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岭皂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沼头,更是在濱河造成了極大的恐慌爷绘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件进倍,死亡現(xiàn)場(chǎng)離奇詭異土至,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)猾昆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)陶因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毡庆,你說(shuō)我怎么就攤上這事坑赡±尤纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵毅否,是天一觀的道長(zhǎng)亚铁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)螟加,這世上最難降的妖魔是什么徘溢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮捆探,結(jié)果婚禮上然爆,老公的妹妹穿的比我還像新娘。我一直安慰自己黍图,他們只是感情好曾雕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著助被,像睡著了一般剖张。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揩环,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天搔弄,我揣著相機(jī)與錄音,去河邊找鬼丰滑。 笑死顾犹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褒墨。 我是一名探鬼主播炫刷,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼貌亭!你這毒婦竟也來(lái)了柬唯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圃庭,失蹤者是張志新(化名)和其女友劉穎锄奢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剧腻,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拘央,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了书在。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灰伟。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栏账,到底是詐尸還是另有隱情帖族,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布挡爵,位于F島的核電站竖般,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茶鹃。R本人自食惡果不足惜涣雕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闭翩。 院中可真熱鬧挣郭,春花似錦、人聲如沸疗韵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伶棒。三九已至旺垒,卻和暖如春彩库,著一層夾襖步出監(jiān)牢的瞬間肤无,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工骇钦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宛渐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓眯搭,卻偏偏與公主長(zhǎng)得像窥翩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳞仙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容