gpt4 book ai didi

swift - Swift 中没有信号量的并发

转载 作者:行者123 更新时间:2023-11-28 12:13:10 29 4
gpt4 key购买 nike

我正在尝试修复我的代码中的并发竞争条件,并且我一直在考虑队列。任何人都可以帮助我理解为什么以下代码在 iOS 上不起作用?

class Concurrency {
private var privateStuff: Int = 0
var accessQueue = DispatchQueue(label: "read", qos: DispatchQoS.background, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.workItem, target: nil)
var writequeue = DispatchQueue(label: "write")
var stuff: Int {
get {
var result: Int!
accessQueue.sync {
result = privateStuff
}
return result
}
set {
accessQueue.suspend()
writequeue.sync {
privateStuff = newValue
}
accessQueue.resume()
}
}
}

我仍然有一个竞争条件,所以 Xcode 说,如果我在这上面运行大量的读取器/写入器。

我错过了什么吗?谢谢

最佳答案

看起来这个解决方案适合您的问题:

https://medium.com/@oyalhi/dispatch-barriers-in-swift-3-6c4a295215d6

数据竞争条件是由您使用两个不同队列这一事实给出的。当另一个线程正在请求属性的 getter 时,没有什么不会阻止其他线程在 setter 中挂起 accessQueue

如链接中的文章所述,解决此读写器问题的方法很少。

我最喜欢的是障碍。

另外,我会防御那些将它们设置为 private let 而不是 vars 的队列,以避免一些聪明的同事将 mainQueue 作为 accessQueue 传递,导致主线程上的线程锁定。

所以整个事情看起来像这样:

class Concurrency {
private var privateStuff: String = 🖕
private let queue = DispatchQueue(label: "read-write", qos: DispatchQoS.background, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.workItem, target: nil)
var stuff: String {
get {
var result: String!
queue.sync {
result = privateStuff
}
return result
}
set {
queue.async(flags: .barrier) {
privateStuff = newValue
}
}
}
}

关于swift - Swift 中没有信号量的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47772765/

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