多線程之GCD(一),多線程gcd

來源:互聯網
上載者:User

多線程之GCD(一),多線程gcd

Grand Central Dispatch簡稱(GCD)是由蘋果公司開發的技術,是一個非常好的用於多核裝置的解決方案。GCD核心在於兩個概念:

     隊列:隊列負責管理開發人員提交的任務,GCD隊列始終以FIFO(先進先出)的方式來處理任務-----但由於處理執行的時間不同,所以先處理的任務並不一定先結束。隊列既可以是串列隊列,也可以是並發隊列,串列隊列每次只處理一個任務,必須前一個任務執行完成後,才能執行下一個任務;並發隊列則可同時處理多個任務,因此可以多個任務並發處理。    隊列底層會維護一個線程池來處理使用者提交任務,線程池的作用是執行隊列管理的任務。串列隊列底層的線程池只是維護一個線程即可,並發隊列則需要維護多個線程。    任務:任務就是使用者提交給隊列的工作單元,這些任務將會給隊列底層維護的線程池執行,這些任務會以多線程的方式執行。

使用GCD遵守兩個步驟:
1.建立隊列。
2.將任務提交給隊列。

建立隊列:
-》串列隊列:串列隊列底層的線程池只要一個線程,因此只提供一個線程來執行任務,所以後一個任務必須等到前一個任務執行結束才能開始執行。
-》並發執行:線程池提供多個線程來執行任務,所以可以按FIFO的順序並發啟動、執行多個任務。
(1)擷取系統預設的全域並發隊列
擷取系統預設的全域並發隊列:
dispatch_queue_t queue =dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
(2)擷取系統主線程關聯的串列隊列
擷取系統主線程關聯的串列隊列:
dispatch_queue_t queue =dispatch_get_main_queue();就相當於直接在程式主線程中執行任務。
(3)建立串列隊列
建立串列隊列:
dispatch_queue_t queue =dispatch_queue_create(“ios.queue”,DISPATCH_QUEUE_SERIAL);
如果將多任務提交給串列隊列,多任務只能一個一個按順序執行。
(4)建立並發隊列
建立並發隊列:
dispatch_queue_t queue =dispatch_queue_create(“ios.queue”,DISPATCH_QUEUE_CONCURRENT);
如果將多個任務提交給並發隊列,可以按FIFO的順序啟動多個並發執行任務。
得到隊列之後,就可以將任務提交給隊列,並由隊列底層管理的線程池來執行任務。

提交任務
向隊列提交任務:
void dispatch_async(dispatch_queue_t queue,dispatch_block_t block):
將代碼塊以非同步方式提交給指定隊列
void dispatch_async_f(dispatch_queue_t queue,void *context,dispatch_function_t work):
將函數以非同步方式提交給指定隊列
void dispatch_sync(dispatch_queue_t queue,dispatch_block_t block):
將代碼塊以同步方式提交給指定隊列
void dispatch_sync_f(dispatch_queue_t queue,void *context,dispatch_function_t block):
將函數以同步方式提交給指定隊列
void dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block):
將代碼塊以非同步方式提交給指定隊列,該隊列底層的線程池將負責在when指定的時間執行該代碼塊。
void dispatch_after_f(dispatch_time_t when,dispatch_queue_t queue,void *context,dispatch_function_t work):
將函數以非同步方式提交給指定隊列,該隊列底層的線程池將負責在when指定的時間執行該函數。
void dispatch_apply(size_t iterations,dispatch_queue_t queue,void(^block)(size_t)):
將代碼塊以非同步方式提交給指定隊列,該隊列底層的線程池將會多次重複執行代碼塊。
void dispatch_apply(size_t iterations,dispatch_queue_t queue,void context,void(*work)(void ,size_t)):
將函數以非同步方式提交給指定隊列,該隊列底層的線程池將會多次重複執行函數。
void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block):
將代碼塊提交給指定隊列,該隊列底層的線程池控制在應用的某個生命週期內僅執行該函數一次。其中predicate參數是一個指向dispatch_once_t(本質就是long型整數)變數的指標,該變數用於判斷該代碼塊是否已經執行過。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.