天天看點

GCD的一些小結

  gcd是基于c語言的底層api,用block定義任務用起來非常靈活便捷.

  gcd的基本思想是就将操作放在隊列中去執行

  (1)操作使用blocks定義

  (2)隊列負責排程任務執行所在的線程以及具體的執行時間

  (3)隊列的特點是先進先出(fifo)的,新添加至對列的操作都會排在隊尾

關于多線程的一些概念:

GCD的一些小結

 gcd一共有5種隊列:main queue

:主隊列,在主隊列中隻有一個主線程,本質也是一個串行隊列

  high priority queue:高優先級隊列

  low priority queue :低優先級隊列

  background priority queue:背景隊列

      default priority queue

:預設優先級隊列,也叫做自定義隊列,又分為:

         1:串行隊列(serial

queue):會順序執行隊列的裡面的任務,一次隻執行一個任務.

         2:并行隊列(concurrent

queue):會并發的執行隊列裡面的任務,執行順序不确定.

常用方法:

 dispatch_sync:同步操作(任務),會執行完block的任務才進行下一個任務.

 dispatch_async:異步操作(任務),會把block送出給隊列就立即傳回,不去關心block是否完成,由隊列去安排調用裡面添加的block.

隊列和任務的使用:

     (1):串行隊列加入同步任務:不會産生新線程,隊列會把任務加入主線程中執行,有順序.

 (2):串行隊列中加入異步任務:會産生一個子線程.隊列會把任務加入到這個子線程中執行,有順序.

 (3):并行隊列中加入同步任務:不會産生新線程,隊列會把任務加入主線程中執行,有順序

 (4):并行隊列中加入異步任務:根據需要産生多個子線程,任務沒有順序執行

 (5):主線程隊列和gcd建立的隊列是不同的。在gcd中建立的隊列優先級沒有主隊列高,是以在gcd中的串行隊列開啟同步任務裡面沒有嵌套任務是不會阻塞主線程

在主隊列中加入同步任務:

 會造成死鎖,原因是主隊列中隻有一個線程就是主線程,而且該線程除非關閉程式,否則一直循環執行,同步任務在主隊列中優先級較高,為了能夠執行任務

 就想搶占主線程資源來執行任務,而主線程卻又預設優先處理其他操作,不肯放手.兩個的優先級都很高,最終導緻死鎖,阻塞線程了.

 在主隊列中加入異步任務:主隊列會先降低異步任務的優先級,等空閑時會把該異步任務放入主線程中執行,是以不會造成堵塞,一般的ui更新都在主隊列的異步任務中完成.

以上均為本人見解,如有錯誤或不同見解還請多多指教...

繼續閱讀