Nis*_*agi 4 concurrency ios swift
运行TSan工具时,我的代码中出现了竞争条件。由于已经从不同的队列和线程同时访问了相同的代码,因此我不能使用串行队列或屏障,因为队列将仅阻止访问共享资源的单个队列,而不会阻止其他队列。
我使用objc_sync_enter(object) | objc_sync_exit(object)和锁NSLock() or NSRecursiveLock()来保护共享资源,但是这些也不起作用。
当我@synchronized()在Objective C中使用关键字来保护共享资源时,它可以按预期工作,并且在特定的代码块中没有获得竞争条件。
因此,什么是在Swift中保护数据的替代方法,因为我们不能@synchronized()在Swift语言中使用关键字。
我不明白“我不能使用串行队列或屏障,因为队列将仅阻止访问共享资源的单个队列,而不阻止其他队列。” 使用带有障碍的并发队列是解决此问题的标准方法。
class MultiAccess {
private var _property: String = ""
private let propertyQueue = DispatchQueue(label: "MultiAccess.property")
var property: String {
get {
var result: String!
propertyQueue.sync {
result = self._property
}
return result
}
set {
propertyQueue.async(flags: .barrier) {
self._property = newValue
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种构造,访问property是原子和线程安全的,而调用者不必做任何特殊的事情。多个读取器可以同时读取而不会互相阻塞。即使在许多读者面前,作家也不会饿死。