什么是GCD
全稱是Grand Central Dispatch.
純C語(yǔ)言,提供了很多強(qiáng)大的函數(shù).
GCD的優(yōu)勢(shì)
- GCD是蘋果公司為多核的并行運(yùn)算提供的方案
- GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核(比如雙核,四核)
- GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程,調(diào)度任務(wù),銷毀線程)
- 程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼
任務(wù)和隊(duì)列
GCD中有2個(gè)核心概念
- 任務(wù): 執(zhí)行什么操作
- 隊(duì)列: 用來(lái)存放任務(wù)
GCD的使用步驟
- 定制任務(wù)(確定要做的事情)
- 將任務(wù)添加到隊(duì)列中
- GCD會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出,放到對(duì)應(yīng)的線程中執(zhí)行
- 任務(wù)的取出遵循隊(duì)列的FIFO原則:先進(jìn)先出,后進(jìn)后出
執(zhí)行任務(wù)
GCD中有2個(gè)用來(lái)執(zhí)行任務(wù)的常用函數(shù)
- 同步執(zhí)行任務(wù)
dispatch_sync(dispatch_queue_t queue, ^(void)block);
- 異步執(zhí)行任務(wù)
dispatch_async(dispatch_queue_t queue, ^(void)block);
queue:隊(duì)列
block:任務(wù)
同步和異步的區(qū)別
- 同步:只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
- 異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
隊(duì)列的類型
GCD的隊(duì)列可以分為2大類型
- 并發(fā)隊(duì)列(Concurrent Dispatch Queue)
- 可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù))
- 并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效
- 串行隊(duì)列(Serial Dispatch Queue)
- 讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù))
同步 異步 并發(fā) 串行
- 同步和異步主要影響:能不能開啟新的線程
- 并發(fā)和串行主要影響:任務(wù)的執(zhí)行方式
隊(duì)列的創(chuàng)建or獲取方式
并發(fā)隊(duì)列
- 使用
dispatch_queue_create
函數(shù)創(chuàng)建并發(fā)隊(duì)列
dispatch_queue_create(const char * _Nullable label, //隊(duì)列名稱
dispatch_queue_attr_t _Nullable attr) //隊(duì)列類型
- 使用
dispatch_get_global_queue
函數(shù)獲得全局的并發(fā)隊(duì)列
dispatch_get_global_queue(long identifier, //隊(duì)列的優(yōu)先級(jí)
unsigned long flags) 此參數(shù)用0即可
串行隊(duì)列
- 使用
dispatch_queue_create
函數(shù)創(chuàng)建串行隊(duì)列 - 使用主隊(duì)列(跟主線程相關(guān)聯(lián)的隊(duì)列)
- 主隊(duì)列是GCD自帶的一種特殊的串行隊(duì)列
- 放在主隊(duì)列中的任務(wù),都會(huì)放到主線程中執(zhí)行
- 使用
dispatch_get_main_queue()
獲得主隊(duì)列
各種隊(duì)列的執(zhí)行效果
并發(fā)隊(duì)列 | 手動(dòng)創(chuàng)建的串行隊(duì)列 | 主隊(duì)列 | |
---|---|---|---|
同步(sync) | 沒有開啟新線程 串行執(zhí)行任務(wù) |
沒有開啟新線程 串行執(zhí)行任務(wù) |
死鎖 |
異步(async) | 有開啟新線程 并發(fā)執(zhí)行任務(wù) |
有開啟新線程 串行執(zhí)行任務(wù) |
沒有開啟新線程 串行執(zhí)行任務(wù) |
注意:
使用sync函數(shù)往當(dāng)前串行隊(duì)列中添加任務(wù),會(huì)卡住當(dāng)前的串行隊(duì)列