仅类中部分方法标注@MainActor时的Swift并发问题
问题解答
1. 是否该代码编译时理应触发警告?
是的,这段代码理应在编译阶段触发并发安全警告。Swift的Strict Concurrency Checking(Complete模式)的核心目标就是在编译期识别潜在的数据竞争风险,而你的代码存在明确的并发安全漏洞,早期Xcode版本(15.0.1/15.1 beta 3)的编译器在检测逻辑上存在疏漏,未能及时发现该问题。
2. 代码哪部分存在违规?
代码的核心违规点有两处:
Counter类型未标记为Sendable却跨Actor传递:你在Main Actor隔离的上下文中调用counter.run(),而run()内部启动的Task会默认继承当前的Main Actor上下文,但Counter本身并非Sendable类型,这打破了Swift并发模型中“跨Actor传递的类型必须是Sendable”的规则,导致非安全的跨Actor状态访问。inc()方法无并发安全保障:inc()方法既没有绑定到特定Actor(比如@MainActor修饰),也没有通过锁、原子操作等手段保证线程安全,却在多任务环境下被调用,直接导致多个任务可以同时执行inc(),引发数据竞争。
后续更新说明
在Swift 5.10快照版本中,编译器已经修复了这个检测漏洞,会在await counter.run()行触发明确警告:Passing argument of non-sendable type 'Counter' into main actor-isolated context may introduce data races,该问题已通过官方修复补丁解决,后续正式版本的编译器会正确识别这类并发风险。
内容的提问来源于stack exchange,提问作者Sebastian Kirsche
相关产品推荐
相关产品推荐

