Swift Actor 中发生数据争用

2024-01-06

我使用 Thread Sanitizer 在 Swift 应用程序中发现了数据争用,因此我第一次尝试通过转换有问题的数据来修复争用条件class to an actor。竞争造成的崩溃似乎已经消失,但 Thread Sanitizer 仍然说代码中存在数据竞争,我认为这在actor.

我无法发布完整内容actor这里,但这是发生竞赛的代码:

actor SampleActor {
    private var things = Set<Int>()
    
    func addThing(_ newThing: Int, seconds: Double) {
        things.insert(newThing)
        Task {
            try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
            self.things.remove(newThing)
        }
    }
}

// Code to cause the race
let sample = SampleActor()
for n in 0 ..< 1000 {
    Task {
        await sample.addThing(n, seconds: Double.random(in: 0...1.0))
    }
}


我可能会以错误的方式处理这个问题,但我需要向SampleActor的一组对象,并让它在一段时间后自动删除。

有一个更好的方法吗?我对使用缺少什么actor在这种情况下避免数据竞争?不应该SampleActor.things在这里不受种族的影响,因为它是一个财产actor?


去除Task {部分于actor

Add async到函数

func addThing(_ newThing: Int, seconds: Double) async {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift Actor 中发生数据争用 的相关文章

随机推荐