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

Swift 意欲成为无数据竞争的并发编程语言

  • 2020-11-27
  • 本文字数:1363 字

    阅读完需:约 4 分钟

Swift意欲成为无数据竞争的并发编程语言

Swift 团队发布了改进 Swift 并发支持的路线图。在第一个阶段,Swift 将提供 async 语法和 actor,而在第二个阶段,重点是消除数据竞争和死锁。


Swift 并发编程模型的核心不会改变,它保留了在独立队列上分派无锁操作并通过回调返回结果的基本理念。这种方法有它的缺点,如编码开销、缺乏效率和容易出错,程序员必须确保严格遵循正确的模式,以保证正确性和性能。


模式是好的,但用 Swift 来表达会丢掉重要的结构,并导致出现问题。解决方案是将这些模式引入到语言中。


以协程为基础,Swift 的async/await语法看起来会像下面这样:


internal func asyncMethod() async {  result = await anotherClass.anotherAsyncMethod()}
复制代码


这种语法的一个好处是消除了在闭包中捕获 self 时需要进行显式声明的要求。Swift async/await 语法的一个特殊特征是 await 关键字只能在包含异步代码的表达式开始时指定一次,而且不能在每个 async 函数之前重复使用。


除了 async 和 await 之外,Swift 还将引入了actor类型。这是定义类的一种简单的方式,这种类拥有私有队列,用于通过序列化的方式同步对其内部状态的访问。


actor class AnActorClass {  // 某些状态  func modifyState() async { ... }}
复制代码


在使用上面的代码时,编译器将确保所有 async 方法都在 actor 的私有队列上运行,并对直接访问其状态的操作进行标记。这将带来很多优化性能的可能性。


Swift 还将支持一种特定的语法,将类的 async 方法绑定到特定的全局 actor。用于同步 UI 操作的 UIActor 就适用这种语法,因为这种操作必须发生在主队列上。例如,你可以这样:


@UIActorclass AClassDoingUIStuff {    func doSomeUITask() async { ... }}
复制代码


在第二阶段,Swift 团队将添加完全的 actor 隔离,以防止数据竞争和死锁。


actor 隔离的基本思想与独占访问内存的思想类似,并以此为基础。Swift 的并发设计从 actor 的自然隔离开始,使用所有权作为补充工具,提供一种易于使用和可组合的安全并发方法。


默认情况下,actor 将提供基本的隔离。这意味着它们将保护自己的内部状态不受数据竞争的影响,比如属性、let 常量、本地值,等等。


但是,当涉及到使用 UnsafeMutablePointer 引用的内存、全局内存和类引用时,actor 自身无法防止数据竞争,因为它们可以在 actor 之间传递,因此也可能会造成数据竞争。


即使只有基本的 actor 模型,开发人员也可以通过全局 actor 来减少数据竞争:如果一个框架需要在一个特定队列上执行所有操作,它可以定义一个全局 actor,类似于 UIActor,并在协议中指定它。


不过,为了获得完全的 actor 隔离,Swift 需要添加新的特性,其中最重要的是将类型声明为“actor local”。这样就不可能在 actor 之间传递 actor 类型。如果真的需要这么做,可以在传递 actor 之前克隆或取消共享。


到了某个时间点,将默认执行这些新特性,这意味着所有的类都将是“actor local”的,而全局变量将被要求通过全局 actor 或被声明为“actor unsafe”来获得保护。在将并发安全加到语言并发机制的核心的同时,这也意味着向后源代码兼容性被破坏,尽管 Swift 团队希望这种影响不会太大。


因为复杂性的存在,要让 Swift 成为一种无数据竞争的并发语言需要大量的语言扩展,需要跨越多个版本才能实现,而关于 actor 完全隔离的很多细节仍有待最终确定。随着新细节的不断发布,InfoQ 将继续跟踪报道。


原文链接


Swift Aims to Become a Data Race-Free Concurrent Language


2020-11-27 13:005453

评论

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

赋能开发者,开放原子全球开源峰会期待你的声音!

开放原子开源基金会

大数据 开源 开源软件

Apache Flink ML 2.2.0 发布公告

Apache Flink

大数据 flink 实时计算

从零学习SDK(9)SDK的局限

MobTech袤博科技

文本搜索工具ack与grep

坚果

Linux 三周年连更

为开发者搭建创新舞台 OpenHarmony创新赛正式启动

最新动态

世优科技AI数字人产品“世优BOTA”发布!全面提升AI虚拟员工能力

联营汇聚

没有主机跑开源软件?速来牧云助手免费领一台!

百川云开发者

云计算 开源 云主机 教程 免费

手语识别:解锁语言交流的新时代

来自四九城儿

如何雇佣一名全民开发者?

草料二维码

开发者 低代码 无代码开发 无代码 无代码微信小程序

Rust、Go 和 Swift 在性能和并发性方面有何差异?

非凸科技

Go swift 性能 编程语言 高并发

使用Plist编辑器——简单入门指南

华为云GaussDB坚持技术引领,以数字化转型激活金融科技新动能

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

【FAQ】统一扫码服务常见问题及解答

HMS Core

HMS Core

低代码平台虽臭名远扬,但用起来却真香

这我可不懂

低代码 JNPF

DevOps 与研发效能资深技术专家张乐:研发效能的升维思考与降维执行

万事ONES

编程中最难的就是命名?这几招教你快速上手

阿里巴巴云原生

阿里云 编程 云原生

FBEC大会 | 瑞云科技 CTO 赵志杰:元宇宙时代的基础设施——实时云渲染

3DCAT实时渲染

实时渲染 实时云渲染 实时渲染云

技术干货|如何利用 ChunJun 实现数据实时同步?

袋鼠云数栈

开源 数据采集

有道CEO周枫:当我们谈论大模型时,应该关注哪些新能力?

有道技术团队

Apple 的 plist 编辑器入门指南:基础操作与高级功能详解

雪奈椰子

浅析低代码开发的典型应用构建场景

力软低代码开发平台

AI数字人产品“世优BOTA”发布会落幕,世优科技纪智辉演讲回顾

联营汇聚

2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

NineData

MySQL 腾讯云 阿里云 云数据库 技术沙龙

如何通过C#/VB.NET代码将PowerPoint转换为HTML

在下毛毛雨

html PowerPoint 文档转换

【源码分析】【seata】at模式分布式事务-tm实现逻辑

如果晴天

源码分析 分布式事务 seata Seata框架

终于有人把动态规划、冒泡排序、二叉树、链表、栈全部讲清楚了

架构师之道

算法

Go 语言快速入门指南:GET 和 POST 方法

宇宙之一粟

Go HTTP post GET 三周年连更

九层天塔DApp合约系统开发搭建

薇電13242772558

NFT

上海首个大模型产业发展研讨会圆满落幕,众顶尖专家共探大模型产业

NLP资深玩家

Split to Be Slim: 论文复现

华为云开发者联盟

人工智能 华为云 论文 华为云开发者联盟 企业号 4 月 PK 榜

常用工具

流火

Swift意欲成为无数据竞争的并发编程语言_移动_Sergio De Simone_InfoQ精选文章