我将Strict Concurrency Checking设置为Complete,并且在Xcode15.0.1和Xcode15.1测试版3中编译以下代码时没有任何警告.
在运行它时,它显示出并发问题.允许inc()
方法同时在两个任务上运行.
我的问题:
- 我认为这不应该在没有警告的情况下进行编译,这样做正确吗?
- 这段代码的哪一部分是非法的?我想是
run()
年的Task
米比赛.但是也许非MainActorinc()
方法不应该从MainActor同步调用.
class Counter {
private var counter = 0
func inc() -> Int {
let v = counter + 1
for _ in 0...1000 {}
counter = v
return v
}
@MainActor
func run() {
Task {
while true {
try? await Task.sleep(for: .seconds(1))
let v = inc()
print("xxx t1", v)
}
}
}
}
class Experiment {
func start() {
Task {
let counter = Counter()
await counter.run()
while true {
try? await Task.sleep(for: .seconds(1))
let v = counter.inc()
print("xxx t2", v)
}
}
}
}
Update 2023-12-04:
我用当前的SWIFT 5.10快照测试了这段代码,现在第await counter.run()
行触发警告"Passing argument of non-sendable type 'Counter' into main actor-isolated context may introduce data races".
看起来这个PR修复了它:https://github.com/apple/swift/pull/67730