NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:004112

评论

发布
暂无评论

芯翌科技:技术理想主义的务实之旅

朋湖网

深度学习keras像搭积木般构建神经网络模型

AI_robot

大厂面试必问!2021新一波程序员跳槽季,附大厂真题面经

欢喜学安卓

android 程序员 面试 移动开发

教育部:探索推动区块链技术在招生考试、学历认证等领域的应用

CECBC

教育管理

区块链农产品溯源--保护舌尖上的安全

13530558032

Mac openssl 未找到/加载失败问题处理

潮湿了我押韵的心情

gorm mysql表关联的一个例子

werben

Apache IceBerg表规范(最全版)(翻译者:聚变)

聚变

大数据 hive 数据湖 iceberg 聚变归来

springboot+redis+rabbitmq实现模拟秒杀系统(附带docker安装mysql,rabbitmq,redis教程)

yk

redis Docker 高并发 RabbitMQ

阿里巴巴研究员叔同:云原生是企业数字创新的最短路径

阿里巴巴云原生

云计算 容器 微服务 开发者 云原生

一个提高领导力的极简工具

石云升

领导力 28天写作 职场经验 管理经验 3月日更

区块链和物联网如何实现万物互联?

CECBC

区块链

专访孙立坚:印度经济发展实力几何 ?

了了Vita

面对不可避免的故障,我们造了一个“上帝视角”的控制台

阿里巴巴云原生

容器 微服务 云原生 监控 应用服务中间件

JVM技术专题-逃逸分析介绍

洛神灬殇

Java JVM

基于 docker 部署 jenkins(二)

李日盛

ndk开发前景,某大厂开发者对于Android多线程的总结,系列篇

欢喜学安卓

android 程序员 面试 移动开发

Linux后端服务器网络编程之线程模型丨reactor模型详解

Linux服务器开发

reactor 后端 网络编程 Linux服务器开发 网络io

pandas apply 应用套路详解

披头

阿里巴巴研究员叔同:云原生是企业数字创新的最短路径

阿里巴巴中间件

云计算 Serverless 容器 云原生 Faas

简单架构图

李朋

架构 架构图

寻找音乐API接入正版音乐曲库?了解HIFIVE音乐开放平台!

HIFIVE音加加

音乐api 正版曲库 音乐sdk

有道云笔记新版编辑器架构设计(上)

有道技术团队

架构 大前端

访问管理未来的四大趋势

龙归科技

网络安全 身份和访问管理

区块链落地应用瞄向海洋生态可持续场景,来看Trace Protocol如何改变人们生活?

CECBC

渔民

tensorflow实现深度卷积生成对抗网络(DCGAN)生成手写数字图片

AI_robot

iOS开发:git上传代码到开源中国的步骤,以及pod的更新方法

花花

ios

keras深度学习框架

AI_robot

数字化浪潮下,“坐不住”的豪车品牌如何破局?

脑极体

【OpenYurt 深度解析】边缘网关缓存能力的优雅实现

阿里巴巴云原生

容器 云原生 k8s 边缘计算 Go 语言

SQL 自连接的魅力

披头

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