iOS 多線程

http://www.cocoachina.com/ios/20170707/19769.html

http://www.cocoachina.com/ios/20170829/20404.html

https://www.cnblogs.com/wendingding/p/3806821.html

https://www.cnblogs.com/wendingding/tag/多線程篇/


GCD常見用法????

1. dispatch_after

該函數(shù)用于任務(wù)延時(shí)執(zhí)行械姻,其中參數(shù)dispatch_time_t代表延時(shí)時(shí)長,dispatch_queue_t代表使用哪個(gè)隊(duì)列机断。如果隊(duì)列未主隊(duì)列楷拳,那么任務(wù)在主線程執(zhí)行,如果隊(duì)列為全局隊(duì)列或者自己創(chuàng)建的隊(duì)列吏奸,那么任務(wù)在子線程執(zhí)行欢揖,代碼如下:

-(void)GCDDelay{

????//主隊(duì)列延時(shí)

????dispatch_time_t?when_main?=?dispatch_time(DISPATCH_TIME_NOW,?(int64_t)(3.0?*?NSEC_PER_SEC));

????dispatch_after(when_main,?dispatch_get_main_queue(),?^{

????????NSLog(@"main_%@",[NSThread?currentThread]);

????});

????//全局隊(duì)列延時(shí)

????dispatch_time_t?when_global?=?dispatch_time(DISPATCH_TIME_NOW,?(int64_t)(4.0?*?NSEC_PER_SEC));

????dispatch_after(when_global,?dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,?0),?^{

????????NSLog(@"global_%@",[NSThread?currentThread]);

????});

????//自定義隊(duì)列延時(shí)

????dispatch_time_t?when_custom?=?dispatch_time(DISPATCH_TIME_NOW,?(int64_t)(5.0?*?NSEC_PER_SEC));

????dispatch_after(when_custom,?self.serialQueue,?^{

????????NSLog(@"custom_%@",[NSThread?currentThread]);

????});

}

2. dispatch_once

保證函數(shù)在整個(gè)生命周期內(nèi)只會(huì)執(zhí)行一次,看代碼奋蔚。

-(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event{

????static?dispatch_once_t?onceToken;

????dispatch_once(&onceToken,?^{

????????NSLog(@"%@",[NSThread?currentThread]);

????});

}

3. dispatch_group_async & dispatch_group_notify

4. dispatch_barrier_async

柵欄函數(shù)她混,這么看來它能擋住或者分隔什么東西,別瞎猜了泊碑,反正你又猜不對(duì)坤按,看這,使用此方法創(chuàng)建的任務(wù)馒过,會(huì)查找當(dāng)前隊(duì)列中有沒有其他任務(wù)要執(zhí)行臭脓,如果有,則等待已有任務(wù)執(zhí)行完畢后再執(zhí)行腹忽,同時(shí)谢鹊,在此任務(wù)之后進(jìn)入隊(duì)列的任務(wù),需要等待此任務(wù)執(zhí)行完成后留凭,才能執(zhí)行。

5. dispatch_apply

該函數(shù)用于重復(fù)執(zhí)行某個(gè)任務(wù)偎巢,如果任務(wù)隊(duì)列是并行隊(duì)列蔼夜,重復(fù)執(zhí)行的任務(wù)會(huì)并發(fā)執(zhí)行,如果任務(wù)隊(duì)列為串行隊(duì)列压昼,則任務(wù)會(huì)順序執(zhí)行求冷,需要注意的是,該函數(shù)為同步函數(shù)窍霞,要防止線程阻塞和死鎖哦

6. dispatch_semaphore_create & dispatch_semaphore_signal & dispatch_semaphore_wait

看這幾個(gè)函數(shù)的時(shí)候你需要拋開隊(duì)列匠题,丟掉同步異步,不要把它們想到一起但金,混為一談韭山,信號(hào)量只是控制任務(wù)執(zhí)行的一個(gè)條件而已,相對(duì)于上面通過隊(duì)列以及執(zhí)行方式來控制線程的開辟和任務(wù)的執(zhí)行,它更貼近對(duì)于任務(wù)直接的控制钱磅。類似于單個(gè)隊(duì)列的最大并發(fā)數(shù)的控制機(jī)制梦裂,提高并行效率的同時(shí),也防止太多線程的開辟對(duì)CPU早層負(fù)面的效率負(fù)擔(dān)盖淡。

dispatch_semaphore_create創(chuàng)建信號(hào)量年柠,初始值不能小于0;

dispatch_semaphore_wait等待降低信號(hào)量褪迟,也就是信號(hào)量-1冗恨;

dispatch_semaphore_signal提高信號(hào)量,也就是信號(hào)量+1味赃;

dispatch_semaphore_wait和dispatch_semaphore_signal通常配對(duì)使用掀抹。

總結(jié)

1. 對(duì)于單核CPU來說,不存在真正意義上的并行洁桌,所以渴丸,多線程執(zhí)行任務(wù),其實(shí)也只是一個(gè)人在干活另凌,CPU的調(diào)度決定了非等待任務(wù)的執(zhí)行速率谱轨,同時(shí)對(duì)于非等待任務(wù),多線程并沒有真正意義提高效率吠谢。

2. 線程可以簡單的認(rèn)為就是一段代碼+運(yùn)行時(shí)數(shù)據(jù)土童。

3. 同步執(zhí)行會(huì)在當(dāng)前線程執(zhí)行任務(wù),不具備開辟線程的能力或者說沒有必要開辟新的線程工坊。并且献汗,同步執(zhí)行必須等到Block函數(shù)執(zhí)行完畢,dispatch函數(shù)才會(huì)返回王污,從而阻塞同一串行隊(duì)列中外部方法的執(zhí)行罢吃。

4. 異步執(zhí)行dispatch函數(shù)會(huì)直接返回,Block函數(shù)我們可以認(rèn)為它會(huì)在下一幀加入隊(duì)列昭齐,并根據(jù)所在隊(duì)列目前的任務(wù)情況無限下一幀執(zhí)行尿招,從而不會(huì)阻塞當(dāng)前外部任務(wù)的執(zhí)行。同時(shí)阱驾,只有異步執(zhí)行才有開辟新線程的必要就谜,但是異步執(zhí)行不一定會(huì)開辟新線程。

5. 只要是隊(duì)列里覆,肯定是FIFO(先進(jìn)先出)丧荐,但是誰先執(zhí)行完要看第1條。

6. 只要是串行隊(duì)列喧枷,肯定要等上一個(gè)任務(wù)執(zhí)行完成虹统,才能開始下一個(gè)任務(wù)弓坞。但是并行隊(duì)列當(dāng)上一個(gè)任務(wù)開始執(zhí)行后,下一個(gè)任務(wù)就可以開始執(zhí)行窟却。

7. 想要開辟新線程必須讓任務(wù)在異步執(zhí)行昼丑,想要開辟多個(gè)線程,只有讓任務(wù)在并行隊(duì)列中異步執(zhí)行才可以夸赫。執(zhí)行方式和隊(duì)列類型多層組合在一定程度上能夠?qū)崿F(xiàn)對(duì)于代碼執(zhí)行順序的調(diào)度菩帝。

8. 同步+串行:未開辟新線程,串行執(zhí)行任務(wù)茬腿;同步+并行:未開辟新線程呼奢,串行執(zhí)行任務(wù);異步+串行:新開辟一條線程切平,串行執(zhí)行任務(wù)握础;異步+并行:開辟多條新線程,并行執(zhí)行任務(wù)悴品;在主線程中同步使用主隊(duì)列執(zhí)行任務(wù)禀综,會(huì)造成死鎖。

8. 對(duì)于多核CPU來說苔严,線程數(shù)量也不能無限開辟定枷,線程的開辟同樣會(huì)消耗資源,過多線程同時(shí)處理任務(wù)并不是你想像中的人多力量大届氢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欠窒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子退子,更是在濱河造成了極大的恐慌岖妄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂祥,死亡現(xiàn)場離奇詭異荐虐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丸凭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門福扬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贮乳,你說我怎么就攤上這事√窆撸” “怎么了向拆?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酪耳。 經(jīng)常有香客問我浓恳,道長刹缝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任颈将,我火速辦了婚禮梢夯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晴圾。我一直安慰自己颂砸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布死姚。 她就那樣靜靜地躺著人乓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪都毒。 梳的紋絲不亂的頭發(fā)上色罚,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音账劲,去河邊找鬼戳护。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瀑焦,可吹牛的內(nèi)容都是我干的腌且。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝠猬,長吁一口氣:“原來是場噩夢啊……” “哼切蟋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榆芦,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤柄粹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后匆绣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驻右,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年崎淳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堪夭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拣凹,死狀恐怖森爽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚣镜,我是刑警寧澤爬迟,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站菊匿,受9級(jí)特大地震影響付呕,放射性物質(zhì)發(fā)生泄漏计福。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一徽职、第九天 我趴在偏房一處隱蔽的房頂上張望象颖。 院中可真熱鬧,春花似錦姆钉、人聲如沸说订。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽克蚂。三九已至,卻和暖如春筋讨,著一層夾襖步出監(jiān)牢的瞬間埃叭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工悉罕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赤屋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓壁袄,卻偏偏與公主長得像类早,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜逻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 前言: 最近想回顧一下多線程問題,看到一篇文章寫的非常詳細(xì),為了便于以后查找以及加深印象,就照著原文摘錄了下文,原...
    FM_0138閱讀 960評(píng)論 1 1
  • iOS多線程編程 基本知識(shí) 1. 進(jìn)程(process) 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序涩僻,就是一段程序的執(zhí)...
    陵無山閱讀 6,043評(píng)論 1 14
  • 很久前的總結(jié),今天貼出來栈顷。適合看了就用逆日,很少講解,純粹用法萄凤。 目錄 Dispatch Queue dispatch...
    和女神經(jīng)常玩閱讀 648評(píng)論 0 3
  • 本篇博客共分以下幾個(gè)模塊來介紹GCD的相關(guān)內(nèi)容: 多線程相關(guān)概念 多線程編程技術(shù)的優(yōu)缺點(diǎn)比較室抽? GCD中的三種隊(duì)列...
    有夢想的老伯伯閱讀 1,020評(píng)論 0 4
  • 我兒,今天你的孩子終于出生了靡努,當(dāng)看著你滿眼慈愛地看著他(她)的時(shí)候坪圾,我在后面默默地祝福你,默默地為你高興惑朦,我最心愛...
    種樹老頭閱讀 260評(píng)論 3 2