GCD多線程歸納和總結(jié)

GCD多線程基礎(chǔ)知識(shí)

Serial Dispatch Queue 串行隊(duì)列
Concurrent Dispatch Queue 并行隊(duì)列

GCD創(chuàng)建隊(duì)列

// 創(chuàng)建串行隊(duì)列
dispatch_queue_create("dispatchSign", DISPATCH_QUEUE_SERIAL);
// 創(chuàng)建并行隊(duì)列
dispatch_queue_create("dispatchSign", DISPATCH_QUEUE_CONCURRENT);
"dispatchSign" 為隊(duì)列標(biāo)識(shí),const char類型字符串,亦為控制臺(tái)輸入的名稱

異步和同步執(zhí)行

dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"同步在主線程中執(zhí)行");
        });

dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"異步在主線程中執(zhí)行");
        });

系統(tǒng)提供的隊(duì)列

取得主隊(duì)列
dispatch_get_main_queue()

主線程是一個(gè)同步的串行隊(duì)列,亦稱主線程

取得global隊(duì)列
// global 默認(rèn)優(yōu)先級(jí)
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

優(yōu)先級(jí)參數(shù)列表:
// 最高優(yōu)先級(jí)
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
// 普通優(yōu)先級(jí)
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
// 低優(yōu)先級(jí)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
// 最低優(yōu)先級(jí),后臺(tái)執(zhí)行
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

global隊(duì)列是系統(tǒng)提供的全局型的,并行隊(duì)列
同一個(gè)優(yōu)先級(jí)的隊(duì)列,先調(diào)用的任務(wù),就會(huì)先執(zhí)行

多線程的帶來的問題

競爭資源:

兩個(gè)線程,同時(shí)訪問同一個(gè)資源,會(huì)造成崩潰的問題

性能消耗:

線程之間的切換,稱為切換上下文環(huán)境
iPhone一直保持著大核心,少核心的CPU封裝原則
一盒CPU同一個(gè)時(shí)間短,只能處理一個(gè)任務(wù)
過多的線程會(huì)造成CPU核心反復(fù)的切換上下文環(huán)境
如果線程過多,上下文切換會(huì)非常消耗硬件性能

應(yīng)對(duì)方案:

資源競爭加鎖: 自旋鎖, 互斥鎖
性能消耗: 少生成隊(duì)列,必要時(shí),生成全局變量或靜態(tài)變量的隊(duì)列,減少上下文環(huán)境的切換

龐大任務(wù)下,對(duì)處理量進(jìn)行切割:

由于一個(gè)任務(wù)只能在一核CPU中運(yùn)行
對(duì)任務(wù)進(jìn)行切割,分成多個(gè)任務(wù),組成多個(gè)串行隊(duì)列或放入并行隊(duì)列中執(zhí)行
在一定程度上,會(huì)更多的調(diào)動(dòng)CPU資源

iOS 6以后GCD才支持ARC

iOS 6 以前需要手動(dòng)釋放
dispatch_release();
手動(dòng)retain
dispatch_retain();

隊(duì)列和線程的對(duì)應(yīng)關(guān)系

串行隊(duì)列,使用一個(gè)線程
串行隊(duì)列 -> 線程
并行隊(duì)列,可能使用多個(gè)線程

并行隊(duì)列:
任務(wù)1 -> 線程1
任務(wù)2 -> 線程2
任務(wù)3 -> 線程3

串行隊(duì)列中,隊(duì)列與線程1對(duì)1,所以隊(duì)列=線程
并行隊(duì)列中,隊(duì)列與線程1對(duì)多,所以隊(duì)列!=線程
例如:
主線程=主隊(duì)列 dispatch_get_main_queue()
但是如果是并行隊(duì)列,則不可將隊(duì)列稱為線程

調(diào)整隊(duì)列的優(yōu)先級(jí)

// global隊(duì)列可在取得時(shí),生成對(duì)應(yīng)的優(yōu)先級(jí)
dispatch_get_global_queue(DISPATCH_TARGET_QUEUE_DEFAULT, 0);

自行創(chuàng)建的隊(duì)列就需要 dispatch_set_target_queue函數(shù)進(jìn)行調(diào)整

// 將queue1的優(yōu)先級(jí),變?yōu)榕cqueue2相同
// 參照
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 被改變優(yōu)先級(jí)的隊(duì)列
dispatch_queue_t queue2 = dispatch_queue_create("dispatchSign", DISPATCH_QUEUE_SERIAL);
// 改變優(yōu)先級(jí)函數(shù)
dispatch_set_target_queue(queue1, queue2);

此外還有使串行隊(duì)列順序執(zhí)行的功能,
原理為: 改變成同一個(gè)global隊(duì)列相同的優(yōu)先級(jí), 然后哪個(gè)串行隊(duì)列先調(diào)用,哪個(gè)就會(huì)先執(zhí)行

dispatch_barrier

在普通任務(wù)執(zhí)行完成之后,再將任務(wù)插入隊(duì)列

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(concurrentQueue, ^{
            NSLog(@"1");
        });
        dispatch_barrier_sync(concurrentQueue, ^{
            NSLog(@"3");
        });
        dispatch_async(concurrentQueue, ^{
            NSLog(@"2");
        });

先輸出1,2 最后再輸入3

dispatch_apply

在隊(duì)列中,執(zhí)行10次,block中的任務(wù)
dispatch_apply 會(huì)鎖死當(dāng)前代碼運(yùn)行的線程
相當(dāng)于在執(zhí)行任務(wù)的時(shí)候用async,在執(zhí)行的最后加入了group_wait

// 并行隊(duì)列無順序,串行隊(duì)列有順序
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_apply(10, globalQueue, ^(size_t index) {
            NSLog(@"執(zhí)行次數(shù)%zd",index);
        });
        NSLog(@"完成");

在globalQueue隊(duì)列中,分別打印,執(zhí)行次數(shù)1~10.最后打印完成

dispatch_suspend暫停隊(duì)列, dispatch_resume重新啟動(dòng)隊(duì)列

dispatch_suspend()
dispatch_resume()

dispatch IO, 文件讀取

詳細(xì)介紹,,,實(shí)在懶得自己再歸納一遍了

dispatch_source

詳細(xì)介紹,,,實(shí)在懶得自己再歸納一遍了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诈嘿,隨后出現(xiàn)的幾起案子咕村,更是在濱河造成了極大的恐慌荡短,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贮配,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)塞赂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門泪勒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宴猾,你說我怎么就攤上這事圆存。” “怎么了仇哆?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵沦辙,是天一觀的道長。 經(jīng)常有香客問我讹剔,道長油讯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任延欠,我火速辦了婚禮陌兑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衫冻。我一直安慰自己诀紊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布隅俘。 她就那樣靜靜地躺著邻奠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪为居。 梳的紋絲不亂的頭發(fā)上碌宴,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蒙畴,去河邊找鬼贰镣。 笑死呜象,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碑隆。 我是一名探鬼主播恭陡,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼上煤!你這毒婦竟也來了休玩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤劫狠,失蹤者是張志新(化名)和其女友劉穎拴疤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體独泞,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呐矾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懦砂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒犯。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荞膘,靈堂內(nèi)的尸體忽然破棺而出愧薛,到底是詐尸還是另有隱情,我是刑警寧澤衫画,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布毫炉,位于F島的核電站,受9級(jí)特大地震影響削罩,放射性物質(zhì)發(fā)生泄漏瞄勾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一弥激、第九天 我趴在偏房一處隱蔽的房頂上張望进陡。 院中可真熱鬧,春花似錦微服、人聲如沸趾疚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糙麦。三九已至,卻和暖如春丛肮,著一層夾襖步出監(jiān)牢的瞬間赡磅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工宝与, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焚廊,地道東北人冶匹。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像咆瘟,于是被迫代替她去往敵國和親嚼隘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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