gpt4 book ai didi

swift - 并发队列上的 `.barrier` 是否应该立即变为事件状态?

转载 作者:搜寻专家 更新时间:2023-10-30 23:05:55 25 4
gpt4 key购买 nike

我不确定这是否在 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的误解?你怎么看?

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

最佳答案

这是 beta 6 中修复的错误。

在 beta 5 中,它不仅没有按照您预期的方式运行,而且 .onQueueAsBarrier 前提条件也失败了。该问题似乎隐藏在带有 .barrier 选项的 async 中,因为如果您通过等效的 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

关于swift - 并发队列上的 `.barrier` 是否应该立即变为事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com