1. ホーム
  2. ios

[解決済み] GCDにおける並列キューと直列キュー

2022-06-05 01:44:45

質問

GCD の並列キューと直列キューを完全に理解するのに苦労しています。私はいくつかの問題を持っており、誰かが私に明確に、ポイントで答えることができることを望んでいます。

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

    • シリアルキューを作成する
    • 私は dispatch_async (を 3 回使用して、3 つのブロック A,B,C をディスパッチしています。

    3つのブロックは実行されるのでしょうか。

    • キューは直列なので、A,B,Cの順で実行されます。

      または

    • ASYNCディスパッチを使用しているため、同時(並列スレッドで同時)には
  2. を使うことができると読んでいます。 dispatch_sync を使用することができると読みました。その場合、私が望むだけのブロックを同期的にディスパッチできる同時実行キューを常に使用することができるので、なぜシリアルキューは存在するのでしょうか?

    良い説明をありがとうございました!

どのように解決するのですか?

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

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

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