他サイト様の引用ばっかりで恐縮ですが、説明がわかりやすかったのでこちらにメモっておきます。
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で渡すと入れていった順番に別スレッドで実行されます。