4

dispatch_async によって 2 つのブロックをシリアル キューに送信すると、最初のブロックの後に 2 番目のブロックが実行されることが保証されますか。

  • dispatch_async(serial_queue, b1);
  • dispatch_async(serial_queue, b2);

b1 が b2 の前に実行されることを保証できますか?

以下は、完全なソース コード セクションです。



    #define COUNTER 10000
      m_value = 0;
      dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL);
      dispatch_group_t group = dispatch_group_create();
       for (int i = 0; i < COUNTER; ++i) {
        dispatch_group_async(group, globalQueue, ^() {
          dispatch_async(queue, ^() {
            ++m_value;
          });
        });
      }
      dispatch_group_notify(group, queue, ^() {
        NSLog(@"m_value Actual: %d Expected: %d", m_value, COUNTER);
      });

      dispatch_release(queue);
      dispatch_release(group);
      queue = nil;
      group = nil;
      return YES;

m_value == COUNTER を常に保証できますか? ありがとう

4

2 に答える 2

3

同時キューに送信されたブロックは同時に実行される場合がありますが、Apple のドキュメントによると、「シリアル キューに送信されたブロックは FIFO 順で一度に 1 つずつ実行されます。」メイン キューは、dispatch_create_queue で作成するすべてのキューと同様にシリアルです。

于 2012-10-16T18:21:00.203 に答える
0

ドキュメントによると、ブロック(グローバルキュー上)は同時に実行できます

「これらのグローバル同時キューに送信されたブロックは、互いに同時に実行される可能性があります。」

于 2012-07-03T18:10:09.010 に答える