【问题标题】:Does dispatch_async block to serial queue keeps order? [duplicate]dispatch_async 阻塞到串行队列是否保持顺序? [复制]
【发布时间】:2012-06-26 16:42:31
【问题描述】:

当我通过 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 &lt 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 总是吗?谢谢

【问题讨论】:

    标签: dispatch-async


    【解决方案1】:

    提交到并发队列的块可以同时执行,但是来自 Apple 文档“提交到串行队列的块以 FIFO 顺序一次执行一个”。主队列是串行的,您使用 dispatch_create_queue 创建的任何队列也是如此。

    【讨论】:

    • 太棒了,所以如果我们想要先进先出,我们可以简单地使用dispatch_create_queue,并使用dispatch_set_target_queue 设置优先级as per this answer :)
    • 是的,但我不确定您是否需要 dispatch_set_target_queue。我很少看到开发人员提高优先级是正确的情况。
    • 我用它来降低优先级到最低级别。我正在使用dispatch_create_queue 创建的队列处理照片,这似乎有所帮助(UI 响应更快)。
    • 在这种情况下,您可能会考虑可用的后台队列(4.3.0 和更高版本)。这保证是串行的,并且会等到前台活动结束。
    • dispatch_queue_create 而不是dispatch_create_queue
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2013-08-30
      • 2014-10-16
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多