2019-11-20 iOS多線程之GCD(三)

信號量Semaphore

信號量是多線程編程中一項很重要的技術。在GCD中告组,使用dispatch_semaphore來表示信號量,相關函數有3個:

1、dispatch_semaphore_create(value) ? 創(chuàng)建信號量,參數表示信號量的數值(可以簡單的理解為同時能有幾個線程執(zhí)行操作)

2价捧、dispatch_semaphore_wait(semaphore,time) ?等待信息量饭耳,即把信號量數值減一。第一個參數為信號量對象遗增,第二個為等待超時的時間

3、dispatch_semaphore_singal(semaphore) 發(fā)送一個信號款青,即信息量數值加一做修。參數為信號量對象

信號量技術,通常用來:

1抡草、使異步操作變?yōu)橥讲僮?/p>

2饰及、加鎖操作,保證線程安全

話不多說康震,上代碼燎含。

? ? dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

? ? dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

? ? dispatch_block_t task1 = dispatch_block_create(0, ^{

? ? ? ? NSLog(@" task1 begin");

? ? ? ? [NSThread sleepForTimeInterval:5];

? ? ? ? NSLog(@"task1 end");

? ? });

? ? dispatch_block_t task2 = dispatch_block_create(0, ^{

? ? ? ? ? NSLog(@" task2 begin");

? ? ? ? ? [NSThread sleepForTimeInterval:1.5];

? ? ? ? ? NSLog(@"task2 end");

? ? });

? ? dispatch_block_t task3 = dispatch_block_create(0, ^{

? ? ? ? ? NSLog(@" task3 begin");

? ? ? ? ? [NSThread sleepForTimeInterval:3];

? ? ? ? ? NSLog(@"task3 end");

? ? });

? ? dispatch_async(concurrentQueue, ^{

? ? ? ? task1();

? ? });

? ? dispatch_async(concurrentQueue, ^{

? ? ? ? dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

? ? ? ? task2();

? ? ? ? dispatch_semaphore_signal(semaphore);

? ? });

? ? dispatch_async(concurrentQueue, ^{

? ? ? ? dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

? ? ? ? task3();

? ? ? ? dispatch_semaphore_signal(semaphore);

? ? });

? ? dispatch_block_notify(task1, dispatch_get_main_queue(), ^{

? ? ? ? dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

? ? ? ? NSLog(@"this is main thread,refreshUI");

? ? ? ? dispatch_semaphore_signal(semaphore);

? ? });

以上代碼,使用信號量腿短,結合dispatch_block_notify屏箍,實現了task3在task2執(zhí)行結束后再執(zhí)行,task4(刷新UI的操作)在所有任務執(zhí)行結束后再執(zhí)行橘忱。當然也可以使用dispatch_group實現相同的業(yè)務場景赴魁,其實dispatch_group底層就是用dispathch_semaphore來實現的。


dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

? ? dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);

? ? dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_SERIAL);

? ? dispatch_block_t task = ^{

? ? ? ? while(true) {

? ? ? ? ? ? dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

? ? ? ? ? ? if(self.theCount>0) {

? ? ? ? ? ? ? ? self.theCount--;

? ? ? ? ? ? ? ? NSLog(@"%@吃掉了一個蘋果,剩余%d個蘋果",[NSThread currentThread],self.theCount);

? ? ? ? ? ? ? ? [NSThread sleepForTimeInterval:0.2];

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? NSLog(@"沒有蘋果了");

? ? ? ? ? ? ? ? dispatch_semaphore_signal(semaphore);

? ? ? ? ? ? ? ? break;//沒有時跳出循環(huán)

? ? ? ? ? ? }

? ? ? ? ? ? dispatch_semaphore_signal(semaphore);

? ? ? ? }

? ? };

? ? dispatch_async(queue1, task);

? ? dispatch_async(queue2, task);

以上代碼钝诚,使用信號量颖御,實現了鎖操作,保證線程安全凝颇。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末潘拱,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子拧略,更是在濱河造成了極大的恐慌芦岂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辑鲤,死亡現場離奇詭異盔腔,居然都是意外死亡,警方通過查閱死者的電腦和手機月褥,發(fā)現死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門弛随,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宁赤,你說我怎么就攤上這事舀透。” “怎么了决左?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵愕够,是天一觀的道長走贪。 經常有香客問我,道長惑芭,這世上最難降的妖魔是什么坠狡? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮遂跟,結果婚禮上逃沿,老公的妹妹穿的比我還像新娘。我一直安慰自己幻锁,他們只是感情好凯亮,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哄尔,像睡著了一般假消。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岭接,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天富拗,我揣著相機與錄音,去河邊找鬼亿傅。 笑死媒峡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的葵擎。 我是一名探鬼主播谅阿,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酬滤!你這毒婦竟也來了签餐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤盯串,失蹤者是張志新(化名)和其女友劉穎氯檐,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體体捏,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡冠摄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了几缭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河泳。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖年栓,靈堂內的尸體忽然破棺而出拆挥,到底是詐尸還是另有隱情,我是刑警寧澤某抓,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布纸兔,位于F島的核電站惰瓜,受9級特大地震影響,放射性物質發(fā)生泄漏汉矿。R本人自食惡果不足惜崎坊,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望负甸。 院中可真熱鬧流强,春花似錦、人聲如沸呻待。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚕捉。三九已至,卻和暖如春柴淘,著一層夾襖步出監(jiān)牢的瞬間迫淹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工为严, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敛熬,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓第股,卻偏偏與公主長得像应民,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夕吻,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容

  • 一诲锹、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關多線程的基本概念。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,050評論 6 18
  • 一涉馅、開端 隊列與任務創(chuàng)建 dispatch_queue_t 自定義GCD隊列归园,區(qū)分串行隊列與并行隊列 dispat...
    思想猿閱讀 439評論 0 0
  • 一、前言 本篇博文介紹的是iOS中常用的幾個多線程技術: NSThread GCD NSOperation 由于a...
    和玨貓閱讀 577評論 0 1
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖風閱讀 2,423評論 0 0
  • iOS多線程編程 寫在前面稚矿,歡迎互相交流庸诱,歡迎指出錯誤; 基本概念 進程:計算機中的程序關于某數據集合上的一次運行...
    wtqhy14615閱讀 219評論 0 0