gpt4 book ai didi

swift - 使用 GCD 在 Swift 3 中同步属性

转载 作者:IT王子 更新时间:2023-10-29 05:34:43 25 4
gpt4 key购买 nike

我最近看了今年的 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,如果该内部队列不是串行的,它也可能导致线程问题,对吧?因为在我的理解中,同步只是保持调用线程并在任务完成时继续。你觉得这个片段怎么样?我错了吗?

最佳答案

我只想展示另一种方法,它使您能够并发读取,但通过使用调度屏障在写入时阻止所有内容。

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 撰写的 Effective Objective C 2.0 一书中解释的一种方法的 Swift 3 转换。

关于swift - 使用 GCD 在 Swift 3 中同步属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38373338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com