如何在 Swift 6 中表达流程管道的所有权释放

问题描述 投票:0回答:1

我有一个高度多线程的应用程序,可以在 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 中解决这个问题?

swift concurrency
1个回答
0
投票

不存在数据竞争,因为每个 ComplexData 都同时由一个且仅一个进程访问

如果您确实知道这一点,那么只需将 ComplexData 标记为

@unchecked Sendable
即可。 — 您正在寻找的“所有权转移”功能听起来像是不可复制的结构。

© www.soinside.com 2019 - 2024. All rights reserved.