Grand Central Dispatch 試玩

[華語, cmn-Hant-TW]

因為開有多執行緒的需求,就研究了一下 mac 的 framework 有提供哪些東西可以用。初步看來就是傳統 pthread 跟 NSThread 可以用,不過 Thread 程式寫起來一向就很煩,所以就想找找有啥替代品可以用,後來就注意到 Mac OS X 10.6 (iOS 4)之後新加的 Grand Central Dispatch。

基本概念很簡單,就是把你要做的東西加進 queue 就好了。把要做的事情放在同一個 queue 的話他就會照順序一個一個執行,當然你可以開很多個 queue 同時跑,那就可以一次做很多事情,直到把系統榨乾為止。

首先要開一個 queue
dispatch_queue_t queue = dispatch_queue_create("cc.pighead.queue", NULL);

第一個參數可以隨便打,第二個參數在 10.6 沒用,10.7 以上才有用途。

然後把要執行的程式碼放進 queue 裡面
dispatch_async(queue, ^{
  printf("this is a block!\n");
});

裡面包住的東西叫 block,至於 block 是啥這邊先不管他,反正就是包在裡面的程式碼會被另外開一個執行緒來跑就是。

然後把他 sync 回來
dispatch_sync(queue, ^{});
最後 release 掉
dispatch_release(queue);

要同時跑很多的話就多開幾個就可以了,想開幾個就開幾個,在 sync 之前所有的 queue 都可以同時跑,如果有變數會共用的話記得用 lock 或是 @sychronized 這些的東西來控管,大致上就是這樣。另外還有 queue 群組跟 for loop 拆解成平行處理的用法,這次沒用到所以就沒特別去注意了。

話說 FreeBSD 上也是可以用 Grand Central Dispatch 的,用法也差不多,需要的是新一點的 kernel、llvm/clang 編譯器以及 devel/libdispatch 這個 port。

參考文件

A Simple Job Queue With Grand Central Dispatch

Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial

Nullified Construction

Mac OS X (Cocoa) NSLock

GCD on FreeBSD

 

Leave a Reply

Your email address will not be published. Required fields are marked *