dispatch_async阻塞到串行队列是否保持顺序?

时间:2012-06-26 16:42:31

标签: dispatch-async

当我通过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吗?感谢

2 个答案:

答案 0 :(得分:3)

提交到并发队列的块可以同时执行,但是从Apple文档“提交到串行队列的块按FIFO顺序一次执行一个”。主队列是串行的,就像使用dispatch_create_queue创建的任何队列一样。

答案 1 :(得分:0)

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

“提交给这些全局并发队列的块可以相互执行。”