137

GCD の同時キューとシリアル キューを完全に理解するのに苦労しています。私はいくつかの問題を抱えており、誰かが私にはっきりとその時点で答えてくれることを願っています.

  1. タスクを次々に実行するために、シリアル キューが作成され、使用されると読んでいます。ただし、次の場合はどうなりますか。

    • シリアル キューを作成します
    • dispatch_async(先ほど作成したシリアル キューで) を 3 回使用して、3 つのブロック A、B、C をディスパッチします。

    3 つのブロックが実行されますか。

    • キューがシリアルであるため、A、B、C の順序で

      また

    • ASYNCディスパッチを使用したため、同時に(並列スレッドで同時に)
  2. dispatch_syncブロックを次々に実行するために、同時キューで使用できることを読んでいます。その場合、必要な数のブロックを同期的にディスパッチできる並行キューをいつでも使用できるのに、シリアルキューが存在するのはなぜですか?

    良い説明をありがとう!

4

6 に答える 6

242

簡単な例: 実行に 1 分かかるブロックがあるとします。メインスレッドからキューに追加します。4つのケースを見てみましょう。

  • async - 並行: コードはバックグラウンド スレッドで実行されます。制御はすぐにメイン スレッド (および UI) に戻ります。ブロックは、そのキューで実行されている唯一のブロックであると想定できません
  • async - serial: コードはバックグラウンド スレッドで実行されます。制御はすぐにメイン スレッドに戻ります。ブロックは、そのキューで実行されている唯一のブロックであると想定できます
  • sync - 並行: コードはバックグラウンド スレッドで実行されますが、メイン スレッドはそれが終了するまで待機し、UI の更新をブロックします。ブロックは、そのキューで実行されている唯一のブロックであると想定できません (数秒前に async を使用して別のブロックを追加できたはずです)。
  • sync - serial: コードはバックグラウンド スレッドで実行されますが、メイン スレッドはそれが終了するまで待機し、UI の更新をブロックします。ブロックは、そのキューで実行されている唯一のブロックであると想定できます

明らかに、長時間実行されるプロセスには最後の 2 つのいずれも使用しません。通常、別のスレッドで実行されている可能性のあるものから UI を (常にメイン スレッドで) 更新しようとしているときに表示されます。

于 2013-10-04T11:12:06.390 に答える