迅速避免数据争用情况

Nis*_*agi 4 concurrency ios swift

运行TSan工具时,我的代码中出现了竞争条件。由于已经从不同的队列和线程同时访问了相同的代码,因此我不能使用串行队列或屏障,因为队列将仅阻止访问共享资源的单个队列,而不会阻止其他队列。

我使用objc_sync_enter(object) | objc_sync_exit(object)和锁NSLock() or NSRecursiveLock()来保护共享资源,但是这些也不起作用。

当我@synchronized()在Objective C中使用关键字来保护共享资源时,它可以按预期工作,并且在特定的代码块中没有获得竞争条件。

因此,什么是在Swift中保护数据的替代方法,因为我们不能@synchronized()在Swift语言中使用关键字。

PFA屏幕截图以供参考- 数据竞赛

Rob*_*ier 5

我不明白“我不能使用串行队列或屏障,因为队列将仅阻止访问共享资源的单个队列,而不阻止其他队列。” 使用带有障碍的并发队列是解决此问题的标准方法。

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是原子和线程安全的,而调用者不必做任何特殊的事情。多个读取器可以同时读取而不会互相阻塞。即使在许多读者面前,作家也不会饿死。