4

当我通过 dispatch_async 将两个块提交到串行队列中时,它是否确保第二个在第一个之后运行:

  • 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 顺序一次执行一个”。主队列是串行的,您使用 dispatch_create_queue 创建的任何队列也是如此。

于 2012-10-16T18:21:00.203 回答
0

根据文档,块(在全局队列上)可以同时执行

“提交到这些全局并发队列的块可以相对于彼此同时执行。”

于 2012-07-03T18:10:09.010 回答