写点什么

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

评论

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

Tufin联合Cisco,将网络安全自动化进行到底

Geek_448e23

网络安全 自动化管理 云安全

盘点2020 | 一个三线程序员的2020年,不卑不亢

沉默王二

程序员 盘点2020 沉默王二

建议收藏,mybatis插件原理详解

田维常

mybatis

《O2O实战:他们是如何利用互联网的》.pdf

田维常

互联网

扩招1W人,字节跳动内部公开12月份Java岗71道面试题

比伯

Java 编程 架构 面试 程序人生

阅站无数!不过我只推荐下面这些

cxuan

推荐 网站

安全管理 | 前后端方案详解:Vue/SpringBoot+SpringSecurity+JWT

梁龙先森

大前端 springboot springsecurity JWT 七日更

微软最强 Python 自动化工具开源了!不用写一行代码!

星安果

Python 开源 自动化 工具 高效率

盘点2020 | 微服务架构下该如何技术选型呢?

xcbeyond

微服务 技术选型 盘点2020 选型原则

智能微卡口监控系统搭建,智慧平安小区建设解决方案

t13823115967

智慧城市

DAPP软件系统开发

系统开发

边缘计算和5G:我们从何而来?

VoltDB

云计算 大数据 5G 物联网 边缘计算

复盘node项目中遇到的13+常见问题和解决方案

徐小夕

Java node.js 大前端 nodejs

盘点2020|多线程的遥感大数据行业产品经历

老壳有点爽

大数据 盘点2020 InSAR

架构师 3 期 3 班 -week4- 作业

zbest

作业 week4

几款Java开发者必备常用的工具,准点下班不在话下

华为云开发者社区

Java 工具 开发

从面试角度分析LinkedList源码

Java旅途

Java List 集合 linkedlist

波场链智能合约软件系统开发|波场链智能合约APP开发

系统开发

从阿里离职后人虚了,头也秃了,就剩这份Java性能优化的PDF了

Java架构追梦

Java 架构 面试 性能优化 并发

forsage以太坊矩阵系统软件开发|forsage以太坊矩阵APP开发

系统开发

985研究生熬夜23天吃透845页架构宝典 终收割腾讯Java岗offer!再也不用怀疑人生了

比伯

Java 编程 架构 面试 程序人生

测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》

无个性不签名

测试开发

对于传统供热系统来说,转型智慧供热需要哪些条件?

一只数据鲸鱼

物联网 数据可视化 供暖系统 3D

警务通APP系统开发,移动警务平台搭建解决方案

t13823115967

智慧城市

PostgreSQL高可用:多主复制解决方案

PostgreSQLChina

数据库 postgresql 开源

干货丨如何使用Redash连接DolphinDB数据源

DolphinDB

数据处理 时序数据库 DolphinDB 数据库开发 redash

程序员因重复记录日志撑爆ELK被辞退!

Java架构师迁哥

女朋友突然问我DNS是个啥....

乱敲代码

计算机网络 DNS DNS服务器

架构师训练营第 1 期第 13 周作业

业哥

5张图搞懂Java引用拷贝、深拷贝、浅拷贝

bigsai

Java 浅拷贝和深拷贝

架构师训练营 1 期 -- 第十三周总结

曾彪彪

极客大学架构师训练营

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