我看了今年的WWDCGCD最近谈话,我认为有一个代码片段有问题。这是关于使用以下方法使属性成为线程安全的调度队列.
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 }
}
}
}
他们使用一个调度队列锁定财产。但我认为这个片段无效,因为内部队列可以是并发的。所以如果我们从两个不同的地方调用 setter调度队列/线程如果该内部队列不是串行的,它也可能导致线程问题,对吧?因为根据我的理解,同步仅保留调用线程,并在任务完成时继续。您对这段片段有何看法?我错了吗?
我只想展示另一种方法,使您能够同时读取,但通过使用调度屏障在写入时阻止所有内容。
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 }
}
}
}
通过这种方法,读取可以在队列上同时发生,但由于屏障的原因,写入是独占执行的。
这只是书中解释的一种方法的 Swift 3 转换有效的 Objective C 2.0,由马特·加洛韦撰写。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)