Swift 6 引入新的可选数据竞争安全模式

Swift 6 数据竞争安全模式介绍

在 WWDC 2024 的演讲中,Apple 的语言与运行时团队负责人兼 Swift 核心团队成员 Ted Kremenek 介绍了 Swift 6 的新功能——数据竞争安全模式。该模式通过引入编译时静态检测器,帮助开发者创建无数据竞争的并发程序。

数据竞争安全的演进路径

Kremenek 解释道,数据竞争安全功能的实现历经了多个 Swift 版本:

  1. Swift 5.5:引入了 async/await 和 Actors。
  2. Swift 5.6:引入了 sendable 分布式 Actors。
  3. Swift 5.9:引入了自定义执行器和隔离断言。
  4. Swift 5.10:引入了完整的数据隔离和全局变量隔离。

这些功能最终在 Swift 6 中整合为一个新的编译器模式,提供完整的数据竞争安全。

数据竞争安全模式的特点

Swift 6 的新编译器模式通过编译时识别数据竞争条件,防止代码的不同部分访问和修改共享数据,使得并发编程更加简便。该模式为可选模式,因为启用它可能需要对现有代码进行修改,尽管这些修改通常是“狭窄的”。开发者可以根据需要决定何时启用该模式。

模块级别的启用

开发者可以按模块启用该模式,具体方法是在使用 Swift 5 语言模式时,将编译器的 Actor 隔离和 Sendable 检查设置为警告模式。

迁移指南

Apple 提供了迁移现有项目到 Swift 6 的指南,帮助开发者有序处理编译器可能生成的大量警告。建议逐个模块迁移,从依赖较少的模块开始,这样大部分修改将局限于该模块内。此外,应考虑是否存在包含不安全全局状态或简单 Sendable 类型的模块,这些模块可能会引发大量警告。

细粒度开关

如果警告数量过多,Swift 编译器提供了三个细粒度开关,分别用于解决特定类型的问题:

  1. 移除由属性包装器引起的 Actor 隔离推断
  2. 对全局变量应用严格的并发性检查
  3. 推断方法和 key path 字面量的 Sendable 特性

这些开关可以逐步启用,以实现完整的并发性检查。

建议

如果 Swift 代码库尚未使用最新版本引入的并发功能,建议逐步采用高级并发支持,例如将基于回调的函数包装为可直接在异步上下文中使用的函数,临时采用内部隔离等。

总结

Swift 6 的数据竞争安全模式通过编译时静态检测器,帮助开发者创建无数据竞争的并发程序。虽然启用该模式可能需要对现有代码进行修改,但通过逐步迁移和细粒度开关,开发者可以有效地解决数据竞争问题。

阅读 31
0 条评论