IOS GCD中的信號量

在這周的程序開發(fā)中用到了GCD中的信號量和隊(duì)列組诗祸,由于對信號量不熟悉,特地來復(fù)習(xí)一下這方面的知識蹲诀。

概念

信號量是用于多線程同步的迂苛,跟鎖不一樣的是三热,信號量不一定是鎖定某一個(gè)資源,而是流程上的概念三幻,比如:有A,B兩個(gè)線程就漾,B線程要等A線程完成某一任務(wù)以后再進(jìn)行自己下面的步驟,這個(gè)任務(wù) 并不一定是鎖定某一資源念搬,還可以是進(jìn)行一些計(jì)算或者數(shù)據(jù)處理之類抑堡。而對于鎖來說,鎖住的資源無法被其余的線程訪問朗徊,從而阻塞線程而實(shí)現(xiàn)線程同步首妖。

函數(shù)介紹

gcd的信號量主要有3個(gè)函數(shù),分別為

dispatch_semaphore_create(M)

創(chuàng)建一個(gè)值為M的信號量

dispatch_semaphore_wait(信號量爷恳,等待時(shí)間)

如果該信號量的值大于0有缆,則使其信號量的值-1,否則舌仍,阻塞線程直到該信號量的值大于0或者達(dá)到等待時(shí)間妒貌。

dispatch_semaphore_signal(信號量)

釋放信號量,使得該信號量的值加1

使用場景

信號量的使用場景應(yīng)該很多铸豁,下面舉幾個(gè)案例

限制線程的最大并發(fā)數(shù)

dispatch_semaphore_t sema = dispatch_semaphore_create(M);
for (NSInteger i = 0;i<N;i++) {
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
        // doing
        dispatch_semaphore_signal(sema);
    });
} 

如上述代碼可知灌曙,總共異步執(zhí)行N個(gè)任務(wù),但是由于我們設(shè)置了值為M的信號量节芥,每一次執(zhí)行任務(wù)的時(shí)候都會(huì)導(dǎo)致信號量的減1在刺,而在任務(wù)結(jié)束后使信號量加1,當(dāng)信號量減到0的時(shí)候头镊,說明正在執(zhí)行的任務(wù)有M個(gè)蚣驼,這個(gè)時(shí)候其它任務(wù)就會(huì)阻塞,直到有任務(wù)被完成時(shí)相艇,這些任務(wù)才會(huì)執(zhí)行颖杏。

阻塞發(fā)請求的線程

有些時(shí)候,我們需要阻塞發(fā)送請求的線程坛芽,比如在多個(gè)請求回調(diào)后統(tǒng)一操作的需求留储,而這些請求之間并沒有順序關(guān)系,且這些接口都會(huì)另開線程進(jìn)行網(wǎng)絡(luò)請求的咙轩。一般地获讳,這種多線程完成后進(jìn)行統(tǒng)一操作的需求都會(huì)使用隊(duì)列組(dispatch_group_t)來完成,但是由于是異步請求活喊,沒等其異步回調(diào)之后丐膝,請求的線程就結(jié)束了,為此,就需要使用信號量來阻塞住發(fā)請求的線程帅矗。實(shí)現(xiàn)代碼如下:

dispatch_async(queue, 0), ^{
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    [網(wǎng)絡(luò)請求:^{
        //請求回調(diào)
        dispatch_semaphore_signal(sema);  
    }];
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
});

這樣偎肃,請求的線程就可以等到回調(diào)結(jié)束后再結(jié)束了,再配合隊(duì)列組就能完成上述的需求浑此。這種技巧可用于以下場景:

  • 多個(gè)請求結(jié)束后統(tǒng)一操作
  • 多個(gè)請求順序執(zhí)行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末软棺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尤勋,更是在濱河造成了極大的恐慌喘落,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件最冰,死亡現(xiàn)場離奇詭異瘦棋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暖哨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門赌朋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篇裁,你說我怎么就攤上這事沛慢。” “怎么了达布?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵团甲,是天一觀的道長。 經(jīng)常有香客問我黍聂,道長躺苦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任产还,我火速辦了婚禮匹厘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脐区。我一直安慰自己愈诚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布牛隅。 她就那樣靜靜地躺著炕柔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倔叼。 梳的紋絲不亂的頭發(fā)上汗唱,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天宫莱,我揣著相機(jī)與錄音丈攒,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巡验,可吹牛的內(nèi)容都是我干的际插。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼显设,長吁一口氣:“原來是場噩夢啊……” “哼框弛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捕捂,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瑟枫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后指攒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慷妙,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年允悦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膝擂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隙弛,死狀恐怖架馋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情全闷,我是刑警寧澤叉寂,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站总珠,受9級特大地震影響办绝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姚淆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一孕蝉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腌逢,春花似錦降淮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媒惕,卻和暖如春系吩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妒蔚。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工穿挨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留月弛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓科盛,卻偏偏與公主長得像帽衙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子贞绵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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