質問: 「メイン スレッドがメイン キュー以外のキュー (シリアルまたはコンカレント) からブロックをデキューする可能性はありますか?」
答え:「いいえ」
GCD がグローバル同時実行キューにサブミットされたブロックをメイン スレッドで実行することを許可した場合、それらのブロックは UI をブロックする長時間実行操作も実行する可能性があり、これは悪いことであり、GCD 独自の設計原則に反することになります。また、それがどのように機能するかが文書化されているわけでもありません ( GCD はオープン ソースでもあるため、GCD がどのように機能するかを正確に知りたい場合は、ソース コードが常に参考になります)。ブロックが現在のスレッドで最適化として実行される可能性が高いのは、dispatch_sync() の場合のみです。これは、プログラマーがそのブロックまで現在のスレッドに戻るつもりがないことが明らかであるためです。 、いずれにしても行われ、現在のスレッドをブロックすることが期待されています動作なので、そこに驚きはありません。この API では非同期の動作が明らかに望まれているため、dispatch_async() については明らかに同じではありません。
最後に、その回答のもう 1 つの混乱点を解決するために、dispatch_queue_create() はシリアル キューを作成するだけでなく、同時キューの作成にも使用できるため、同時キューの実行はグローバル同時キューの唯一の機能ではありません! 2 番目の引数を参照してください。DISPATCH_QUEUE_CONCURRENT
同時キューを作成するように設定できます (man ページは少し古くなっていますが、HeaderDoc/usr/include/dispatch/queue.h
は信頼できます)。