Swift:具有存储属性的枚举,即使使用串行队列进行突变,也不是线程安全的

Swift: Enums with stored properties not thread safe even when mutated using a serial queue

提问人:Parth 提问时间:4/20/2021 最后编辑:Parth 更新时间:4/20/2021 访问量:246

问:

此问题与 Apple 开发者论坛上报告的另一个问题有关,该问题标题为 4 年前的 deinit 中如何避免数据争用。我看到生产中出现与编译器添加的关联数据和代码相关的崩溃,以取消初始化具有包含引用类型的关联数据的枚举。outlined consume

在试图找出其他人是否遇到同样的问题时,我偶然发现了上面的帖子。我将该帖子中的示例简化为下面的更简单示例,并可靠地因访问不当而崩溃。(我在 Playground 中运行了它并崩溃了,但没有堆栈跟踪)

import Foundation
class Racer {
    let queue = DispatchQueue(label: "Racer-\(UUID())")
    var value: String? = "" // Desugars to Optional<String>, an enum
    func race() {
        queue.async {[weak self] in
            self?.value = UUID().uuidString
        }
    }
}
let racer = Racer()
while true {
    racer.race()
}

error:执行中断,原因:EXC_BAD_ACCESS(code=1,address=0x357d20cc94c0)。

这是 Swift 中尚未修补的错误吗?

iOS Swift Xcode 多线程 枚举

评论

0赞 Itai Ferber 4/20/2021
这里的具体问题是什么?
2赞 Parth 4/20/2021
@ItaiFerber我想知道这是否是 swift 中的错误。让我在问题中补充这一点
0赞 Itai Ferber 4/20/2021
非常好。您能否提供崩溃跟踪?例如,我根本无法在调试或发布版本中重现这一点。
0赞 Parth 4/20/2021
我在 playground 上运行了这个,但我没有得到堆栈跟踪。对不起。让我也补充一点
1赞 Parth 4/20/2021
guard let self = self else { return }可能会阻止此崩溃。但是由于类似的原因,我看到我们的生产代码崩溃了。这是同一问题的非常简单的复制。我试图引起更多关注 如何在deinit中避免数据竞赛 这似乎是关键问题

答: 暂无答案