针对getter和setter

时间:2017-10-02 03:42:21

标签: ios swift grand-central-dispatch swift4

我有以下代码,据我所知,应该在_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似乎发现了吸气剂和制定者之间的竞争条件。

enter image description here enter image description here

我错过了什么吗?

2 个答案:

答案 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