天天看點

11.02-多線程_GCD

文章目錄

      • 1.隊列
      • 2.栅欄函數
      • 3. 排程組
      • 3.信号量
      • Dispatch_Source

GCD : 純C語言,自動利用更多的CPU核心,自動管理線程的生命周期(建立線程,排程任務,銷毀線程)

11.02-多線程_GCD

1.隊列

-主隊列

專門用來在主線程上排程任務的隊列

不會開啟新線程

如果目前主線程正在有任務執行,那麼無論主隊列中目前被添加了什麼任務,都不會被排程

dispatch_get_main_queue();

  • 全局隊列

為了友善程式員的使用,蘋果提供了全局隊列 dispatch_get_global_queue(0, 0)

全局隊列是一個并發隊列

在使用多線程開發時,如果對隊列沒有特殊需求,在執行異步任務時,可以直接使用全局隊列

2.栅欄函數

  • 栅欄函數隻對自己定義的并發隊列有效果
  • 保證順序執行
  • 保證線程安全
    11.02-多線程_GCD
  • dispatch_barrier_sync/async 之前的任務執行完了才能執行執行這個函數
    11.02-多線程_GCD
    11.02-多線程_GCD

3. 排程組

11.02-多線程_GCD
  • 所有加入排程組的任務都完成了之後,才會執行通知的函數
    11.02-多線程_GCD
  • 結果
    11.02-多線程_GCD

3.信号量

11.02-多線程_GCD
11.02-多線程_GCD
  • 代碼
  1. 信号量的初始值為0
  2. 當程式走到dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);時,因為信号量為0,是以一直等待着,不往後執行
  3. 知道某個線程完成了任務,dispatch_semaphore_signal(semaphore); 信号量會+1

    信号量為1了,那麼某個dispatch_semaphore_wait會往下執行,并且把信号量減一

    11.02-多線程_GCD
  • 結果
11.02-多線程_GCD

Dispatch_Source

11.02-多線程_GCD
11.02-多線程_GCD
  • GCD定時器不依靠runloop,而是依靠核心,是以時間更準
    11.02-多線程_GCD