その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

dispatch_get_global_queue と dispatch_queue_create の違い

他サイト様の引用ばっかりで恐縮ですが、説明がわかりやすかったのでこちらにメモっておきます。

dispatch_get_global_queue と dispatch_queue_create の違い

Nacho4d - programming notes: December 2010 より)

メインキュー : メインスレッドで実行

dispatch_queue_t main = dispatch_get_main_queue();


グローバルキュー : バックグラウンドで実行

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);


プライベートキュー : バックグラウンドで実行、名前付きのキュー

dispatch_queue_t queue = dispatch_queue_create("com.nacho4d.myApp.myQueue",NULL);


他のタイプのキューとの大きな違いはブロックや関数が逐次的に実行されていくこと。他のキューではタスクをエンキューしても実際にどの順番で実行されるかが分からないが、プライベートなキューでは必ずキューの頭からタスクを実行していくのでシリアルなキューを実現できる。
プライベートなキューを作成するとRetainカウントが1なので、 最後にリリースをすることを忘れずに

dispatch_release(high);

dispatch_async と dispatch_sync の違い

Grand Central Dispatch その2 Queue - Objective-Audio より)

ayncは非同期でバラバラに、syncは同期で順番に、キューにブロックを処理をさせようとする関数です。と説明すると、キューにも同じような用途で2種類あるのに何で関数がまた同じように2種類分かれているんだと思ってしまうのですが、ちょっと役割が違います。

ブロックが処理されるスレッドを調べてみると、asyncは呼び出し元のスレッドとは別のスレッドでブロックを処理させ、syncは呼び出し元と同じスレッドで処理をさせるようです。

実際の挙動としては、グローバルキューにasyncでブロックを渡すと別スレッドで並列に実行されますが、syncで渡すと現在のスレッドをつかうのでそのまま直列に実行されます。シリアルキューにsyncで渡せばもちろんそのまま直列に実行ですが、asyncで渡すと入れていった順番に別スレッドで実行されます。