【问题标题】:New tasks don't wait for GCD Barriers新任务不等待 GCD 障碍
【发布时间】:2017-03-01 22:46:51
【问题描述】:

我了解了一些关于 GCD 障碍的知识,并想检查一下这些信息(来自 Apple docs):

在屏障块之后提交的任何块都不会在屏障块完成之前执行。

通过此代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (int i = 0; i < 500, i++) {
  dispatch_async(queue, ^{
    NSLog("%d", i);
  }
  if ((i % 50) == 0) {
    dispatch_barrier_async(queue, ^{
      for (int j = 0; j < 5; j++) {
        [NSThread sleepForTimeInterval:1];
        NSLog(@"Barrier!");
      }
    });
  }
}

我预计每 50 次计数,队列将停止 5 秒,但事实并非如此。相反,屏障与其他任务并行执行,并且所有尽管有屏障的任务都会立即执行。文档是错的还是我误解了什么?提前致谢

【问题讨论】:

  • 如果您使用queue = dispatch_queue_create("SomeName", DISPATCH_QUEUE_CONCURRENT); 创建队列会发生什么?

标签: ios objective-c grand-central-dispatch


【解决方案1】:

您似乎误读了文档中的下一段

您指定的队列应该是您创建的并发队列 自己使用 dispatch_queue_create 函数。如果你排队 传递给此函数的是串行队列或全局队列之一 并发队列,此函数的行为类似于 dispatch_async 函数。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

不会充当障碍,而是正常的 dispatch_async

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2015-07-28
    • 1970-01-01
    • 2015-02-02
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多