Seb*_*ldt 10 grand-central-dispatch swift swift3
我最近看了WWDC GCD的谈话,我认为有一个代码片段有问题.它是关于使用DispatchQueues使属性线程安全.
class MyObject {
    private var internalState: Int
    private let internalQueue: DispatchQueue // Serial or Concurrent?
    var state: Int {
        get {
            return internalQueue.sync { internalState }
        }
        set (newState) {
            internalQueue.sync { internalState = newState }
        }
    }
}
他们使用DispatchQueue来锁定属性.但我认为这个片段无效,因为internalQueue可能是并发的.所以,如果我们所说的setter从两个不同的DispatchQueues /线程如果内部队列中不连续,这也可能导致右线程问题?因为在我的理解中,sync只保存调用线程,并在任务完成时继续.你觉得这个片段怎么样?我错了吗?
And*_*rea 11
我想展示另一种方法,使您能够同时阅读,但在使用调度屏障进行写入时阻止所有内容.
class MyObject {
private var internalState: Int
private let internalQueue = DispatchQueue(label: "reader-writer", attributes: .concurrent))
var state: Int {
    get {
        return internalQueue.sync { internalState }
    }
    set (newState) {
        internalQueue.async(flags: .barrier) { internalState = newState }
    }
  }
}
使用该方法,读取可以在队列上同时发生,但由于屏障,写入是专门执行的.
这只是由Matt Galloway编写的有效目标C 2.0一书中解释的方法的Swift 3转换.
| 归档时间: | 
 | 
| 查看次数: | 3440 次 | 
| 最近记录: |