我不确定这是否打破了
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] 举报,一经查实,本站将立刻删除。