使用 GCD 同步 Swift 3 中的属性
Synchronize Properties in Swift 3 using GCD
我看了今年的 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 可能是并发的。因此,如果我们从两个不同的 DispatchQueues/Threads 调用 setter 如果该内部队列不是串行的,它也可能导致线程问题,对吗?因为在我的理解中,同步只是保持调用线程并在任务完成时继续。你觉得这个片段怎么样?我错了吗?
But i think this snippet is not valid, because the internalQueue could be concurrent
但不是并发的。您创建的调度队列默认是串行的。这就是技术(和示例)的重点。
我只想展示另一种方法,它使您能够并发读取,但通过使用调度屏障在写入时阻止所有内容。
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 本书 Effective Objective C 2.0 中解释的一种方法的转换,作者是 Matt Galloway。
我看了今年的 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 可能是并发的。因此,如果我们从两个不同的 DispatchQueues/Threads 调用 setter 如果该内部队列不是串行的,它也可能导致线程问题,对吗?因为在我的理解中,同步只是保持调用线程并在任务完成时继续。你觉得这个片段怎么样?我错了吗?
But i think this snippet is not valid, because the internalQueue could be concurrent
但不是并发的。您创建的调度队列默认是串行的。这就是技术(和示例)的重点。
我只想展示另一种方法,它使您能够并发读取,但通过使用调度屏障在写入时阻止所有内容。
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 本书 Effective Objective C 2.0 中解释的一种方法的转换,作者是 Matt Galloway。