Swift 5.10 为并发代码带来完整的数据隔离编译时安全性

Swift 5.10 发布总结

主要观点

Swift 5.10 是一个重要的更新,主要完善了语言并发模型,实现了编译器级别的完全数据隔离。尽管该版本引入的新提案较少,但其在并发模型上的进展标志着 Swift 在数据竞争安全性方面的重大突破。

关键信息

  1. 数据隔离的完善:Swift 5.10 完善了语言各个角落的数据竞争安全语义,修复了 Sendable 和 actor 隔离检查中的多个 bug,增强了完全并发检查的保证。
  2. 新编译器标志:引入了 -strict-concurrency=complete 标志,使编译器能够在编译时检测潜在的数据竞争。此前在 Swift 5.9 中运行时检测到的隔离违规现在会在编译时作为潜在编程错误标记并发出警告。
  3. 假阳性问题:新的严格行为可能导致假阳性,即正确代码被错误标记。这是由于编译器减少了分析量以节省编译时间,未来版本将改进这一点。
  4. 局部禁用数据隔离检查:可以通过 nonisolated(unsafe)@unchecked Sendable 局部禁用完全数据隔离检查,但这会使程序进入“不安全”状态,需谨慎使用。
  5. 安全访问共享状态的两种方式:使用不可变状态与 Sendable,或将共享状态封装在全局 actor 中(如 @MainActor),这是在 Swift 5.10 编译器下安全访问共享状态的唯一两种方式。
  6. 遗留代码处理:在处理使用信号量或 DispatchQueues 手动确保隔离的遗留代码时,可能需要使用不安全的禁用指令。

重要细节

  • 并发模型的演进:自 Swift 5.5 引入 async/await、actors 和结构化并发,到 Swift 5.7 采用 Sendable 协议作为线程安全类型的基石,再到 Swift 5.10 实现编译时完全数据隔离,Swift 的并发模型已经成熟。
  • 未来改进:Swift 团队正在积极改进并发模型,以减少数据竞争的假阳性,预计在 Swift 6 版本中会有进一步优化,该版本可能在下一届 Apple WWDC 大会上发布。

总结

Swift 5.10 在并发模型上的进展使其在数据竞争安全性方面迈出了重要一步,尽管存在假阳性的问题,但通过局部禁用检查和未来版本的改进,开发者可以更安全地处理并发编程。

阅读 36
0 条评论