阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

评论

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

【web 开发基础】PHP 中的默认(缺省)参数的函数 (33)

迷彩

缺省参数 函数 web开发基础 11月月更 默认参数

带你实现react源码的核心功能

goClient1992

React

SREWorks 数智服务尝鲜,你的数据准备好了吗?

阿里云大数据AI技术

大数据 运维 数据 十一月月更

K8S环境的Jenkin性能问题处理续篇(任务Pod设置)

程序员欣宸

Kubernetes jenkins 11月月更

《算法》世界一

初学者

算法 网络 11月月更

《算法》世界二

初学者

算法 网络 11月月更

如何用科学的方法“撞大运”? | 学点运气

赵新龙

CTO 创新 与运气竞争

看完这篇SpringBoot让我在阿里成功涨薪40%,感谢

钟奕礼

Java java程序员 java面试 java编程

基于OpenHarmony的ArkUI框架进阶对于高性能容器类和持久化和原子化的运用

恒山其若陋兮

前端 11月月更

Kafka SASL 用户认证机制

spacerrobot

kafka 认证授权 SASL SCRAM JAAS

自动化测试成熟度模型

老张

DevOps 自动化测试

前后端结合解决Excel海量公式计算的性能问题

葡萄城技术团队

前端 性能 Excel

MatrixOne从入门到实践01——初识MatrixOne

MatrixOrigin

MatrixOrigin MatrixOne

深入React源码揭开渲染更新流程的面纱

goClient1992

React

算法基础:单链表图解及模板总结

timerring

算法 11月月更 单链表

Java对象拷贝原理剖析及最佳实践

京东科技开发者

Java Apache 编程 对象拷贝 srping

如何给 Fiori Elements 应用添加自定义按钮

Jerry Wang

前端开发 web开发 Fiori SAP UI5 11月月更

C++---类型萃取---std::remove_cv/std::remove_cv

桑榆

C++ STL 11月月更

使用keytool生成Tomcat证书

源字节1号

创云融达基于 Curve 块存储的智慧税务场景实践

网易数帆

开源 分布式存储 Ceph curve

react的useState源码分析

flyzz177

React

MASA Framework 事件总线 - 进程内事件总线

MASA技术团队

Framework MASA Framewrok MASA

react源码分析:深度理解React.Context

flyzz177

React

一个漏测Bug能让你想到多少?

得物技术

测试 测试框架 bug修复 漏洞检测 测试技术

2022年第三季度泛出行行业洞察:泛出行行业正在经历数智化升级的关键时期,用户规模保持平稳增长,行业整体良性发展

易观分析

数智化 泛出行

手写一个react,看透react运行机制

goClient1992

React

react源码分析:组件的创建和更新

flyzz177

React

AR手势识别交互,让应用更加“得心应手”

HMS Core

HMS Core

【个人成长】《代码的艺术》视频分享合集

非晓为骁

职业规划 开发 软件工程能力 代码的艺术

HarmonyOS 3重磅版本更新,Mate Xs 2等更多设备支持超级中转站!

Geek_2d6073

OpenHarmony 3.2 Beta多媒体系列——音视频播放gstreamer

OpenHarmony开发者

OpenHarmony

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