2

私はキューがスレッドではないことを知っています。キューは、GCD のスレッドよりも上位の概念です。プログラマーはキューのみを処理し、効率を最大化するためにブロックを実行するスレッドをシステムに決定させます。

そして、メイン キューがメイン スレッドにバインドされることを知っています。つまり、メイン キューにブロックを配置すると、メイン スレッドだけがデキューして実行します。私の質問は: メイン スレッドがメイン キュー以外のキュー (シリアルまたはコンカレント) からブロックをデキューする可能性はありますか?

4

2 に答える 2

3

質問: 「メイン スレッドがメイン キュー以外のキュー (シリアルまたはコンカレント) からブロックをデキューする可能性はありますか?」

答え:「いいえ」

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は信頼できます)。

于 2012-10-14T19:57:07.863 に答える
1

を使えば可能ですdispatch_syncのドキュメントにdispatch_syncは次のように記載されています。

最適化として、この関数は可能な場合、現在のスレッドでブロックを呼び出します。

したがって、メインスレッドで使用するdispatch_syncと、メインスレッドでブロックが実行される場合があります。

于 2012-10-12T03:19:05.997 に答える