我有以下代码,据我所知,应该在_predictions
上提供线程安全的读写。我的isolationQueue是一个并发队列,需要保持这样。我在此队列上调用多个独立的异步操作来计算各种图像的预测。各种调用之间唯一的共享项是设置何时预测。
var isolationQueue = DispatchQueue.global(qos: .default)
var _predictions: [Int:[Prediction]] = [:]
var predictions:[Int: [Prediction]] {
get {
var result: [Int: [Prediction]]!
isolationQueue.sync {
result = _predictions
}
return result
}
set(value) {
isolationQueue.sync {
self._predictions = value
}
}
}
然而由于某些原因,Thread Sanitizer似乎发现了吸气剂和制定者之间的竞争条件。
我错过了什么吗?
答案 0 :(得分:1)
全局调度队列是并发队列,所以它们不能 用于防止资源的并发访问。
您应该为此目的定义自己的串行调度队列:
var isolationQueue = DispatchQueue(label: "my.queue.identifier")
答案 1 :(得分:0)
对于您的情况,使用DispatchSemaphore()更简单,开销更少。代码看起来像
var isolationSem = DispatchSemaphore(value: 1)
var _predictions: [Int:[Prediction]] = [:]
var predictions:[Int: [Prediction]] {
get {
var result: [Int: [Prediction]]!
isolationSem.wait()
result = _predictions
isolationSem.signal()
return result
}
set(value) {
isolationSem.wait()
self._predictions = value
isolationSem.signal()
}
}
有关DispatchSemaphore不合适的情况,请参阅this。