中樞調(diào)度器 多核并行運(yùn)算解決方案
兩個(gè)核心概念 任務(wù) 和 隊(duì)列? 其中隊(duì)列存放任務(wù) 任務(wù)的取出遵循隊(duì)列的先進(jìn)先出冈在,后進(jìn)后出的原則
1.sync? 和 async
其中同步和異步 主要影響作用于是否能開(kāi)啟新線程?
同步在當(dāng)前線程中執(zhí)行,不具備開(kāi)啟新線程能力巨坊,
異步可以在新的線程中執(zhí)行,具備開(kāi)啟新的線程能力
2.serial 和? concurrent
并發(fā) 既允許多個(gè)任務(wù)同時(shí)執(zhí)行 (只在異步隊(duì)列中有效)
串行 既多個(gè)任務(wù)順序執(zhí)行
3.concurrent
--1.使用 dispatch_queue_create 函數(shù)創(chuàng)建隊(duì)列?
--2.GCD默認(rèn)已經(jīng)提供了全局的并發(fā)隊(duì)列 供整個(gè)應(yīng)用實(shí)用曲管,無(wú)需手動(dòng)創(chuàng)建
--3.同步線程 + 并發(fā)隊(duì)列
不會(huì)開(kāi)啟新的線程 串行 沒(méi)有線程談和并發(fā)
4.serial
--1.創(chuàng)建串行隊(duì)列
--2.特殊的串行隊(duì)列 主隊(duì)列
只要是主隊(duì)列 無(wú)論是同步函數(shù)還是異步函數(shù) 都在主線程中執(zhí)行
--3.異步線程 + 串行隊(duì)列
開(kāi)辟一條子線程并順序執(zhí)行
--4.同步線程 + 串行隊(duì)列
在主線程中 順序執(zhí)行
--5.同步線程 + 主隊(duì)列
若當(dāng)前線程為住線程 會(huì)導(dǎo)致線程阻塞判沟,知道內(nèi)存溢出崩潰
因?yàn)閳?zhí)行l(wèi)og1 后的代碼相當(dāng)于一個(gè)任務(wù)A 該任務(wù)A在主隊(duì)列中順序執(zhí)行,
而
任務(wù)A 中的sync 會(huì)立即執(zhí)行 相當(dāng)于任務(wù)B 也會(huì)立即執(zhí)行
無(wú)法確定A 更優(yōu)先 還是B更優(yōu)先 則導(dǎo)致 線程阻塞?
可以歸納為
使用同步線程 向 當(dāng)前串行隊(duì)列中添加任務(wù) 會(huì)導(dǎo)致線程阻塞
若當(dāng)前線程不是主線程? 則會(huì) 回到主線程中順序執(zhí)行
5.GCD線程間的通訊
6.GCD其他常用函數(shù)
--1._barrier 系列 除了async 還有sync?
但是queue 不能是全局并發(fā)隊(duì)列??
dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
在全局并發(fā)隊(duì)列中? barriaer 無(wú)效
--2.快速迭代器 apply
7.隊(duì)列組
--1.創(chuàng)建一個(gè)隊(duì)列組
dispatch_group_tgroup =dispatch_group_create();
--2.將多個(gè)需要執(zhí)行的任務(wù)添加進(jìn)隊(duì)列組中
--3.等待隊(duì)列組中所有的任務(wù)結(jié)束調(diào)用notify
--4.調(diào)用結(jié)果
調(diào)用添加進(jìn)隊(duì)列組內(nèi)的兩個(gè)異步多線程任務(wù) 直到完成后調(diào)用notify方法 最后同步住線程完成操作
8.利用GCD實(shí)現(xiàn)一個(gè)單例
+(void)alloc 調(diào)用alloc zone 方法 所以封死zone 方法 最靠譜
若需要copy該對(duì)象,則肯定首先有對(duì)象私沮,所以直接返回static 對(duì)象即可