回顧
在前兩篇博客产喉,已經(jīng)介紹了進(jìn)程
和線程
捂掰,還介紹了自旋鎖
和互斥鎖
等相關(guān)內(nèi)容敢会,在 iOS 開(kāi)發(fā)中,使用最多的還是 GCD
这嚣,那么從本篇開(kāi)始講陸續(xù)介紹 GCD
鸥昏。
1. 什么是 GCD
GCD定義
Grand Center Dispatch
簡(jiǎn)稱GCD
,是蘋(píng)果公司開(kāi)發(fā)的技術(shù)疤苹,以優(yōu)化應(yīng)用程序支持多核心處理器互广。
- 純
C
語(yǔ)言,提供了非常多期待的函數(shù)卧土。 -
GCD
是蘋(píng)果公司為多核的并行運(yùn)算出的解決方案惫皱。 -
GCD
會(huì)自動(dòng)利用更多的CPU
內(nèi)核(比如雙核、四核) ,GCD
會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程缝彬、調(diào)度任務(wù)癣亚、銷毀線程) - 程序員只需要告訴
GCD
想要執(zhí)行什么任務(wù),不需要編寫(xiě)任何線程管理代碼媳谁。
GCD
將任務(wù)添加到隊(duì)列,并且指定執(zhí)?任務(wù)的函數(shù)
GCD工作原理
GCD
的兩個(gè)核心:任務(wù)
和隊(duì)列
2. 任務(wù)和隊(duì)列
任務(wù)
:需要執(zhí)行什么操作
隊(duì)列
:用來(lái)存放任務(wù)的
GCD
使用的兩個(gè)步驟:創(chuàng)建任務(wù)友酱、將任務(wù)添加到隊(duì)列
- 創(chuàng)建任務(wù):確定要做的事情
- 將任務(wù)添加到隊(duì)列中
-
GCD
會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出來(lái)晴音,放到對(duì)應(yīng)的線程中去執(zhí)行。 - 任務(wù)的取出遵循
FIFO
原則:先進(jìn)先出缔杉,后進(jìn)后出锤躁。
-
串行隊(duì)列
串行隊(duì)列
(Serial Dispatch Queue)或详,任務(wù)一個(gè)接著一個(gè)的執(zhí)行系羞,一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)霸琴,串行隊(duì)列是順序執(zhí)行
的椒振。
-
串行隊(duì)列示意圖:
串行隊(duì)列
并發(fā)隊(duì)列
并發(fā)隊(duì)列
(Concurrent Dispatch Queue),可以讓多個(gè)任務(wù)并發(fā)(同時(shí)
)執(zhí)行梧乘,自動(dòng)開(kāi)啟多個(gè)線程同時(shí)執(zhí)行任務(wù)澎迎。并發(fā)功能只有在
異步(dispatch_async)函數(shù)
下才有效。
- 并發(fā)隊(duì)列示意圖:
并發(fā)隊(duì)列
并發(fā)隊(duì)列选调,先調(diào)度執(zhí)行的不一定先執(zhí)行完成嗡善,這和CPU
分配的時(shí)間有關(guān)系,還和任務(wù)的大小有關(guān)学歧,在分配的時(shí)間內(nèi)沒(méi)有完成罩引,CPU
:老鐵你先靠邊站會(huì),讓下一個(gè)哥們先執(zhí)行枝笨,下次分配到你時(shí)間再繼續(xù)執(zhí)行吧袁铐。
3. 函數(shù)
- 任務(wù)使用
block
封裝 - 任務(wù)的
block
沒(méi)有參數(shù)也沒(méi)有返回值 - 執(zhí)行任務(wù)的函數(shù)
異步dispatch_async
- 不用等待當(dāng)前語(yǔ)句執(zhí)行完畢揭蜒,就可以執(zhí)行下一條語(yǔ)句
- 會(huì)開(kāi)啟線程執(zhí)行
block
的任務(wù) - 異步是多線程的代名詞
同步dispatch_sync
- 必須等待當(dāng)前語(yǔ)句執(zhí)行完畢,才會(huì)執(zhí)行下一條語(yǔ)句
- 不會(huì)開(kāi)啟線程
- 在當(dāng)前執(zhí)行
block
的任務(wù)
(1) 讓程序平行排隊(duì)的特定任務(wù)剔桨,根據(jù)可用的處理資源屉更,安排他們?cè)谌魏慰捎玫?code>處理器核心上執(zhí)行任務(wù) 。
(2) 一個(gè)任務(wù)可以是一個(gè)函數(shù)洒缀,是一個(gè)閉包體GCD
的底層此意使 用線程實(shí)現(xiàn)的,不過(guò)這樣可以讓程序員不用關(guān)注實(shí)現(xiàn)的細(xì)節(jié)瑰谜。
(3) GCD
中必須要使用的是各種隊(duì)列
,我們遇過(guò)block
树绩,把具體的代碼放到隊(duì)列
中萨脑,隊(duì)列中的任務(wù)排隊(duì)執(zhí)行
,系統(tǒng)會(huì)自動(dòng)的把隊(duì)列中的具體任務(wù)分配到具體的線程中和CPU
中(如果是多核處理器)饺饭,具體創(chuàng)建多少個(gè)線程渤早,分配到哪個(gè)線程都是由系統(tǒng)管理
。
更多內(nèi)容持續(xù)更新
?? 喜歡就點(diǎn)個(gè)贊吧????
?? 覺(jué)得有收獲的瘫俊,可以來(lái)一波鹊杖,收藏+關(guān)注,評(píng)論 + 轉(zhuǎn)發(fā)扛芽,以免你下次找不到我????
??歡迎大家留言交流骂蓖,批評(píng)指正,互相學(xué)習(xí)??川尖,提升自我??