加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:41:34 所属栏目:百科 来源:网络整理
导读:我不确定这是否打破了 xcode8 beta 5.看看这段代码.你认为首先应该打
我不确定这是否打破了 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读