写点什么

Swift 5.10 重磅更新:并发代码安全性再上新台阶

  • 2024-03-29
    北京
  • 本文字数:1007 字

    阅读完需:约 3 分钟

大小:491.21K时长:02:47
Swift 5.10 重磅更新:并发代码安全性再上新台阶

最新发布的 Swift 5.10 版本虽然只带来了少数新提案,但在语言的并发模型方面却取得了显著进步。Swift 团队工程师 Holly Borla 解释说,现在编译器已经能够在编译阶段确保数据的完全隔离。


Borla 回顾了 Swift 并发模型自 Swift 5.5 引入 async/await、actors 和结构化并发以来的成熟过程。从 Swift 5.7 采用 Sendable 协议作为线程安全类型的基石,到 Swift 5.10 实现编译时完全数据隔离,每一步都体现了 Swift 在并发编程领域的持续进步。


Swift 5.10 在语言的各个方面全面完善了数据竞态安全语义,并修复了 Sendable 和 actor 隔离检查中的大量 bug,从而加强了完全并发检查的保证。实际上,Swift 5.10 编译器新增了一个名为 -strict-concurrency=complete 的标志,这个标志能在编译时检测潜在的数据竞态,从而加强并发编程的安全性。在之前的 Swift 5.9 版本中,某些隔离违规问题只能在运行时通过断言来检测,而在 Swift 5.10 中,这些问题在编译阶段就会被标记为潜在的编程错误,并引发警告。


虽然这种更严格的行为有助于提升代码的安全性,但也可能导致误报,即正确的代码被错误地标记。Borla 指出,这是由于编译器需要减少分析量以控制编译时间成本,这一问题将在未来的语言版本中得到改进。


为了应对这种情况,开发者可以在特定的 actor 或实现 Sendable 协议的类上使用 nonisolated(unsafe)@unchecked Sendable 来局部禁用完全数据隔离检查。但需要注意的是,这种做法将使代码进入 “不安全” 的领域,因此在选择退出完全数据隔离检查时,务必谨慎行事,确保自己了解潜在的风险。正如 iOS 开发者和 Swift 书籍作者 Donny Wals 所建议的:


每当你想使用 nonisolated(unsafe) 时,最好先反思一下:是否可以考虑将标记为隔离的类型转变为全局 actor,或者是否可以将属性的类型设定为 Sendable 且设置为不可变。在 Swift 5.10 编译器中,安全访问共享状态的方式主要有两种:一是结合使用不可变状态与 Sendable,二是利用 @MainActor 将共享状态封装在全局 actor 中。


然而,在编译那些使用信号量或 DispatchQueues 手动确保隔离的旧代码时,可能需要用到不安全的退出指令,这一点需要注意。


如前所述,Swift 5.10 的并发模型并非尽善尽美,有时可能会产生过多的数据竞态误报。据 Borla 透露,Swift 团队正在积极改进这一点,为即将在下一次 Apple WWDC 大会上发布的 Swift 6 版本做好充分准备。


原文链接

https://www.infoq.com/news/2024/03/swift-5-10-released/

2024-03-29 08:004808

评论

发布
暂无评论
发现更多内容

Python基础(六) | 面向对象类定义及特性详解

timerring

实例 10月月更

架构师的十八般武艺:变更管理

agnostic

需求变更

​Java进阶(三十九)Java集合类的排序,查找,替换操作

No Silver Bullet

Java 排序 查找 10月月更 替换

【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现

清风莫追

递归 数据结构与算法、 10月月更

【牛客刷题-算法】2-算法入门-栈的压入、弹出序列

清风莫追

算法 10月月更

乐观锁和悲观锁

潜水员

并发

计算机网络——以太网交换机学习和转发帧

StackOverflow

编程 计算机网络 10月月更

Taurus: 面向机器学习的数据面架构

俞凡

人工智能 网络 自智网络

【愚公系列】2022年10月 Go教学课程 016-运算符之逻辑运算符和其他运算符

愚公搬代码

10月月更

Linux操作系统——用户管理、实用指令

胖虎不秃头

Linux 10月月更

计算机网络——集线器与交换机的区别

StackOverflow

编程 计算机网络 10月月更

工赋开发者社区 | 某大型电子装备总装数字化工厂MES/MOM系统实施

工赋开发者社区

Linux操作系统——组管理和权限管理

胖虎不秃头

Linux 操作系统 10月月更

【从0到1学算法】2.递归

Geek_65222d

10月月更

这些js原型及原型链面试题你能做对几道

loveX001

JavaScript

架构师的十八般武艺:风险管理

agnostic

风险管理

【牛客刷题-算法】NC4 判断链表中是否有环

清风莫追

算法 10月月更

【LeetCode】在LR字符串中交换相邻字符Java题解

Albert

LeetCode 10月月更

Linux操作系统——定时任务调度、磁盘分区与挂载、网络配置

胖虎不秃头

Linux 操作系统 10月月更

Docker下,五分钟极速体验机器学习

程序员欣宸

Docker 10月月更

你是如何使用React高阶组件的?

beifeng1996

React

JavaScript中this指向哪儿?如何确定this?-前端面试进阶

loveX001

JavaScript

[架构实战] 课后作业二

爱学习的麦子

​Java进阶(三十八)快速排序

No Silver Bullet

Java 快速排序 10月月更

匿名网络追踪溯源机制及方法

郑州埃文科技

IP地址 追踪溯源 匿名网络

【一Go到底】第二天---你好,Go and GOROOT&GOPATH

指剑

golang Go入门 10月月更

如何打通 SAP Cloud for Customer 系统和微信公众号的双向消息通信功能

汪子熙

node.js 微信 SAP 微信平台 10月月更

Python基础(七) | 文件、异常以及模块详解

timerring

异常 模块 10月月更

Qt中读取json文件以及总结

中国好公民st

c++ qt 10月月更

Web3.0杂谈-#004(51/100)

hackstoic

NFT Web3.0

工赋开发者社区 | 当PLC与见“IT”:MES/MOM标准之ISA-95基础内容介绍

工赋开发者社区

Swift 5.10 重磅更新:并发代码安全性再上新台阶_大前端_Sergio De Simone_InfoQ精选文章