日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

了解GCD

發(fā)布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 了解GCD 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、GCD簡介

二、GCD好處

三、GCD任務和隊列

1、任務

同步執(zhí)行(sync):

異步執(zhí)行(async):

2、隊列

串行隊列(Serial Dispatch Queue):

并發(fā)隊列(Concurrent Dispatch Queue):

四、GCD的使用步驟

1、隊列的創(chuàng)建方法/獲取方法

2、 任務的創(chuàng)建方法

五、GCD的基本使用

1、同步執(zhí)行 + 并發(fā)隊列

2、異步執(zhí)行 + 并發(fā)隊列

3、同步執(zhí)行 + 串行隊列

4、異步執(zhí)行 + 串行隊列

5、主隊列

5.1、主隊列 + 異步任務

5.2、主隊列 + 同步任務

六、總結(jié)

本文章為作者學習文檔,如有轉(zhuǎn)載,侵權(quán)問題,請自主聯(lián)系作者,謝謝。

一、GCD簡介

Grand Central Dispatch(GCD) 是 Apple 開發(fā)的一個多核編程的較新的解決方法。它主要用于優(yōu)化應用程序以支持多核處理器以及其他對稱多處理系統(tǒng)。它是一個在線程池模式的基礎(chǔ)上執(zhí)行的并發(fā)任務。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用

二、GCD好處

  • GCD可用于多核并發(fā)運算。
  • GCD會自動利用更多的CPU內(nèi)核。
  • GCD會自動管理線程的生命周期(創(chuàng)建線程,調(diào)度任務,銷毀線程)。
  • 程序員只需要告訴GCD想要執(zhí)行什么任務,不需要編寫任何線程管理代碼。

三、GCD任務和隊列

1、任務

任務:就是執(zhí)行操作的意思,換句話說就是你在線程中執(zhí)行的那段代碼。

執(zhí)行任務的方式有兩種:同步執(zhí)行(sync)和異步執(zhí)行(async)。

兩者的主要區(qū)別是:是否等待隊列的任務執(zhí)行結(jié)束,以及是否具備開啟新線程的能力。

同步執(zhí)行(sync):

同步添加任務到指定的隊列中,在添加的任務執(zhí)行結(jié)束之前,會一直等待,直到隊列里面的任務完成之后再繼續(xù)執(zhí)行。

只能在當前線程中執(zhí)行任務,不具備開啟新線程的能力。

異步執(zhí)行(async):

異步添加任務到指定的隊列中,它不會做任何等待,可以繼續(xù)執(zhí)行任務。

可以在新的線程中執(zhí)行任務,具備開啟新線程的能力。

注意:?異步執(zhí)行(async) 雖然具有開啟新線程的能力,但是并不一定開啟新線程。這跟任務所指定的隊列類型有關(guān)。

2、隊列

隊列:這里的隊列指執(zhí)行任務的等待隊列,即用來存放任務的隊列。隊列是一種特殊的線性表,采用FIFO(先進先出)的原則。

GCD中有兩種隊列:串行隊列和并行隊列。兩者都符合先進先出的原則。

兩者的主要區(qū)別是:執(zhí)行順序不同,以及開啟線程數(shù)不用。

串行隊列(Serial Dispatch Queue):

每次只有一個任務被執(zhí)行。讓任務一個接著一個地執(zhí)行。(只開啟一個線程,一個任務執(zhí)行完畢后,再執(zhí)行下一個任務)

并發(fā)隊列(Concurrent Dispatch Queue):

可以讓多個任務并發(fā)(同時)執(zhí)行。(可以開啟多個線程,并且同時執(zhí)行任務)

注意:?并發(fā)隊列 的并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效

四、GCD的使用步驟

GCD 的使用步驟其實很簡單,只有兩步。

  • 創(chuàng)建一個隊列(串行隊列或并發(fā)隊列)
  • 將任務追加到任務的等待隊列中,然后系統(tǒng)就會根據(jù)任務類型執(zhí)行任務(同步執(zhí)行或異步執(zhí)行)

1、隊列的創(chuàng)建方法/獲取方法

  • 可以使用dispatch_queue_create來創(chuàng)建隊列,需要傳入兩個參數(shù),第一個參數(shù)表示隊列的唯一標識符,用于 DEBUG,可為空,Dispatch Queue 的名稱推薦使用應用程序 ID 這種逆序全程域名;第二個參數(shù)用來識別是串行隊列還是并發(fā)隊列。DISPATCH_QUEUE_SERIAL 表示串行隊列,DISPATCH_QUEUE_CONCURRENT 表示并發(fā)隊列。
// 串行隊列的創(chuàng)建方法 dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL); // 并發(fā)隊列的創(chuàng)建方法 dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
  • 對于串行隊列,GCD 提供了的一種特殊的串行隊列:主隊列(Main Dispatch Queue) 。

  • 所有放在主隊列中的任務,都會放到主線程中執(zhí)行。

  • 可使用dispatch_get_main_queue()獲得主隊列。

// 主隊列的獲取方法 dispatch_queue_t queue = dispatch_get_main_queue();
  • 對于并發(fā)隊列,GCD 默認提供了全局并發(fā)隊列(Global Dispatch Queue)。
  • 可以使用dispatch_get_global_queue來獲取。需要傳入兩個參數(shù)。第一個參數(shù)表示隊列優(yōu)先級,一般用DISPATCH_QUEUE_PRIORITY_DEFAULT。第二個參數(shù)暫時沒用,用0即可。
// 全局并發(fā)隊列的獲取方法 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

2、 任務的創(chuàng)建方法

GCD 提供了同步執(zhí)行任務的創(chuàng)建方法dispatch_sync和異步執(zhí)行任務創(chuàng)建方法dispatch_async。

// 同步執(zhí)行任務創(chuàng)建方法 dispatch_sync(queue, ^{// 這里放同步執(zhí)行任務代碼 }); // 異步執(zhí)行任務創(chuàng)建方法 dispatch_async(queue, ^{// 這里放異步執(zhí)行任務代碼 });

五、GCD的基本使用

區(qū)別并發(fā)隊列串行隊列主隊列
同步(sync)沒有開啟新線程,串行執(zhí)行任務沒有開啟新線程,串行執(zhí)行任務沒有開啟新線程,串行執(zhí)行任務
異步(async)有開啟新線程,并發(fā)執(zhí)行任務有開啟新線程(1條),串行執(zhí)行任務沒有開啟新線程,串行執(zhí)行任務

1、同步執(zhí)行 + 并發(fā)隊列

代碼如下:

?

結(jié)果如下:?

?

根據(jù)結(jié)果可知:在當前線程中執(zhí)行任務,不會開啟新線程,執(zhí)行完一個任務,在執(zhí)行下一個任務。

2、異步執(zhí)行 + 并發(fā)隊列

代碼如下:

?

?結(jié)果如下:

?

根據(jù)結(jié)果可以得出:除了當前的主線程,系統(tǒng)又開啟了3個線程,并且任務是交替/同時執(zhí)行的。

3、同步執(zhí)行 + 串行隊列

代碼如下:

?結(jié)果如下:

?

根據(jù)結(jié)果可以得出:所有任務都是在當前線程中執(zhí)行,并且沒有開啟新的線程,任務是按照順序執(zhí)行的,因為是串行隊列,所以每次只有一個任務執(zhí)行,一個認為完成,然后下一個任務開始。

4、異步執(zhí)行 + 串行隊列

代碼如下:

結(jié)果如下:

?

根據(jù)結(jié)果可以得出:會開啟新的線程,但是因為任務是串行的,所以執(zhí)行完一個任務,在執(zhí)行下一個任務。

5、主隊列

主隊列:是專門負責調(diào)度主線程的任務,沒有辦法開辟新的線程。所以,在主隊列下的任務不管是異步任務還是同步任務都不會開辟線程,任務只會在主線程順利執(zhí)行。

5.1、主隊列 + 異步任務

代碼如下:

?結(jié)果如下:

根據(jù)結(jié)果可以得出:主隊列中放入異步任務,不是馬上執(zhí)行,而是等到主隊列中的其他不是我們異步添加的任務執(zhí)行完成之后,才會執(zhí)行我們異步添加的任務。

?

5.2、主隊列 + 同步任務

主隊列 + 同步任務 在不同的線程中會出現(xiàn)不同的結(jié)果,當在主線程中調(diào)用,會出現(xiàn)死鎖,而在其他的線程中則不會。

GCD

六、總結(jié)

線程和隊列,異步同步函數(shù)的關(guān)系?

A、一個應用程序表示開啟了一個線程。

B、一個進程至少有一個線程,即至少有一個主線程,也可以開啟多條線程。

C、一個線程中可以有多個隊列,每個隊列中額可以執(zhí)行多個任務。

D、在線程中執(zhí)行任務的順序可以是按順序來執(zhí)行,也可以用不按順序來執(zhí)行。即表現(xiàn)為串行和并行。

E、那異步和同步函數(shù)的作用在哪里?

并行和串行隊列,與異步同步函數(shù)的排列組合有如下這些:

1)并行隊列+異步函數(shù):開啟多條線程,不按順序執(zhí)行任務。

2)串行隊列+異步函數(shù):開啟一條新線程,按順序執(zhí)行任務。

3)主隊列+異步函數(shù):不開啟新的線程,按順序執(zhí)行任務。

4)并行隊列+同步函數(shù):不開啟新的線程,按順序執(zhí)行任務。

5)串行隊列+同步函數(shù):不開啟新的線程,按順序執(zhí)行任務。

6)主隊列+同步函數(shù):會出現(xiàn)死鎖現(xiàn)象。原因:循環(huán)等待,主隊列的東西要等主線程執(zhí)行完,又不能開線程,所以下面的任務要等上面的任務執(zhí)行完,然后就卡死了。

總結(jié)

以上是生活随笔為你收集整理的了解GCD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。