微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 并发队列上的`.barrier`是否应立即生效?

我不确定这是否打破了 xcode8 beta 5.看看这段代码.你认为首先应该打印“A”,还是首先打印“B”?

let q = dispatchQueue(label: "q",attributes: .concurrent)
q.async(flags: .barrier) {
  Thread.sleep(forTimeInterval: 0.25)
  print("A")
}
q.sync {
  print("B")
}

由于.barrier,我认为它应该阻止并发队列并打印“A”,“B”,但它不在最新的xcode beta中.

错误?对.barrier的误解?你怎么看?

请注意:我知道如果我使用串行队列,这将以预期的顺序打印 – 这是一个更大的系统的一小部分,我需要孤立地理解这种行为.

解决方法

这是测试版6中修复的错误.

在beta 5中,它不仅没有按照你期望的方式运行,而且.onQueueAsBarrier前置条件也失败了.该问题似乎与.barrier选项异步,因为如果你通过等效的Objective-C API,dispatch_barrier_async执行它,它工作正常,例如:

let q = dispatchQueue(label: "q",attributes: .concurrent)

BarrierExperiment.dispatchBarrierAsync(q) {
    dispatchPrecondition(condition: .onQueueAsBarrier(q))
    Thread.sleep(forTimeInterval: 0.25)
    print("A")
}

q.async() {
    print("B")
}

哪里

@interface BarrierExperiment : NSObject

+ (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block;

@end

@implementation BarrierExperiment

+ (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block {
    dispatch_barrier_async(queue,block);
}

@end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐