我有一个高度多线程的应用程序,可以在 Swift 5 中完美运行。我想切换到 Swift 6,并且我遇到了很少的错误,但仍然有这个错误,而且无法摆脱。
代码通过进程管道传输非常复杂的数据结构,如下所示:
// Can't be Sendable because of the need for mutable properties that will be modified
// by Process1, Process2 etc...
final class ComplexData {
var name: String
init(name: String) {
self.name = name
}
}
func Process1(lotsOfData: [ComplexData]) {
for data in lotsOfData {
// Do complex things with complex data, and then give data to another process
Task.detached {
Process2(data: data)
}
// I will never ever do anything more with data
}
}
func Process2(data: ComplexData) {
// Do complex things with complex data, and then give data to another process
Task.detached {
Process3(data: data)
}
// I will never ever do anything more with data
}
func Process3(data: ComplexData) {
// Do complex things with complex data, and I am done
}
我在每个 Task.detached 行都收到错误:
Task-isolated value of type '() async -> ()' passed as a strongly transferred parameter; later accesses could race
。
不存在数据竞争,因为每个
ComplexData
都同时被一个且仅一个进程访问。
在 Rust 中,这种“访问时间排除”将通过“所有权转移”来解决。如何在正确的 Swift 6 中解决这个问题?
不存在数据竞争,因为每个 ComplexData 都同时由一个且仅一个进程访问
如果您确实知道这一点,那么只需将 ComplexData 标记为
@unchecked Sendable
即可。 — 您正在寻找的“所有权转移”功能听起来像是不可复制的结构。