iOS 多線程:GCD詳解

? 在我們了解GCD之前,首先要明白一個概念,GCD是蘋果封裝的一套多線程調用API,目的是為了我們能夠更好的使用多線程,但是,GCD并不能直接對線程進行創建以及銷毀的操作,如果覺得dispatch_get_global_queue這段代碼是用來創建線程的,那么請重新認識GCD。

了解GCD,必須理解兩個概念,任務以及隊列

任務:同步執行(sync)和異步執行(async),可以了解為提取任務的方式。

同步執行和異步執行的區別在于,是否會創建新的線程,是否等待隊列任務執行結束。

同步執行(sync)

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

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


同步執行

異步執行(async)

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

可以在新的線程中執行任務,具備開啟新線程的能力


異步執行

隊列:并發隊列(concurrent)和串行隊列(serial),可以理解為提供任務的方式。

串行隊列(Serial Dispatch Queue)

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

串行隊列創建方法

并發隊列(Concurrent Dispatch Queue)

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


并行隊列創建方法

全局隊列(Global Dispatch Queue)

系統封裝全局并發隊列,與并發隊列特性一樣。


全局隊列創建方法

主隊列(Main Dispatch Queue)

一種特殊的串行隊列,可以了解為所有被執行的代碼,都會默認加入主隊列中,并在主線程上執行。


主隊列創建方法

同步執行(sync)和串行隊列(serial):

同步執行不會創建新的線程,并且會等待隊列中的任務執行完畢再執行下一任務。串行隊列按照順序提供任務,一個任務執行完畢提供下一個任務。所以同步執行和串行隊列組合產生的結果是不會創建新線程,串行執行任務。

同步執行(sync)和并行隊列(concurrent):

同步執行不會創建新的線程,并且會等待隊列中的任務執行完畢再執行下一任務。并行隊列按照順序提供任務,但并不會等待上個任務執行完畢,會直接提供下個任務。所以同步執行和并行隊列組合產生的結果是不會創建新線程,串行執行任務。

異步執行(async)和串行隊列(serial):

異步執行會創建新的線程,并且不會等待隊列中的任務執行完畢再執行下一任務。串行隊列按照順序提供任務,一個任務執行完畢提供下一個任務。所以異步執行和串行隊列組合產生的結果是會創建新線程(1個),串行執行任務。

異步執行(async)和并行隊列(concurrent):

異步執行會創建新的線程,并且不會等待隊列中的任務執行完畢再執行下一任務。并行隊列按照順序提供任務,但并不會等待上個任務執行完畢,會直接提供下個任務。所以異步執行和并行隊列組合產生的結果是會創建多個線程,并發執行任務。

同步執行(sync)和主隊列(main):

會造成死鎖,dispatch_sync(dispatch_get_main_queue(),)如果實在主線程中執行的,相當于是在主隊列里添加一個任務A,block中的代碼向主隊列中添加了任務B,任務B開始執行的時候發現主隊列里有任務A就會等待任務A執行,任務A在等待任務B執行完畢才會繼續向下執行,任務A和任務B相互等待造成死鎖。

解決方法:dispatch_sync(dispatch_get_main_queue(),)放入其他線程。

異步執行(sync)和主隊列(main):

參考同步執行與串行隊列,由于主隊列中的任務都是放在主線程中進行的,所以不會再額外創建新的線程,在主線程中串行執行任務。

總結如下:


隊列與任務

到此,gcd的主要用法就介紹完了,想要了解gcd其他的一些用法:

GCD 柵欄方法:dispatch_barrier_async(用于等待必要的結果,才能繼續進行的需求)

GCD 延時執行方法:dispatch_after

GCD 一次性代碼(只執行一次):dispatch_once(用于生成單例)

GCD 快速迭代方法:dispatch_apply(用于循環調用和for類似)

GCD 隊列組:dispatch_group

dispatch_group_notify

dispatch_group_wait

dispatch_group_enter、dispatch_group_leave

GCD 信號量:dispatch_semaphore(線程鎖)

請參考本文的參考文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容