AI实践哪家强?来 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:006351

评论

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

后疫情时代,国际形势向好,企业出海如何把握风险管控?

用友BIP

中企出海

硬核!阿里P8呕心沥血5年总结的Java面试速成手册开源一天上榜首

Java你猿哥

Java 微服务 算法 多线程 ssm

GaussDB存储过程介绍

平平无奇爱好科技

GaussDB为什么成为游戏行业的心头爱?

平平无奇爱好科技

再识华为云数据库——GaussDB

轶天下事

音乐人解密:究竟是如何一步一步成为音乐人的?

懒得勤快

使用Leangoo领歌敏捷工具实施多团队规模化敏捷管理

顿顿顿

项目管理 敏捷项目管理 敏捷工具 scrum工具

中国振华刘昕:携手用友打造电子行业的数智化平台,服务全行业

用友BIP

2023用友BIP技术大会

重学 Java 设计模式:实战建造者模式

Java你猿哥

Java 设计模式 ssm 计算机

全量通过!华为云GaussDB首批完成信通院全密态数据库评测

轶天下事

ChatGPT热度不减!华为宣布入局,盘古GPT能否大杀四方!

加入高科技仿生人

低代码 数智化 ChatGPT 文心一言 通义千问

区块链代币DAPP通缩燃烧模式系统开发技术方案

I8O28578624

身未动心已远,AI带你流浪地球

华为云开发者联盟

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

GaussDB如何给世界一个更优选择?

平平无奇爱好科技

GaussDB数据类型转换介绍

平平无奇爱好科技

国产芯片开发为什么这么难?2023 中国芯片开发者调查报告发布

博文视点Broadview

亿视电子基于PolarDB-X打造能源数字基座实践

阿里云数据库开源

MySQL 数据库 分布式 阿里云; PolarDB-X

GaussDB,连续五次No.1!

平平无奇爱好科技

华为云GaussDB助力MetaERP构建“收入成本”产品,高效支撑华为多业务

轶天下事

ChatGPT会取代低代码开发平台吗?

力软低代码开发平台

降本增效,StarRocks 在同程旅行的实践

StarRocks

数据库 大数据 数据仓库 湖仓一体 大数据 开源

GaussDB数据类型介绍

轶天下事

GaussDB数据库事务介绍

平平无奇爱好科技

华为云GaussDB入选“2022年数字技术融合创新应用解决方案”

轶天下事

深入剖析Redis性能问题及优化方案

xfgg

redis 优化 6 月 优质更文活动

软件测试/测试开发丨App自动化测试学习笔记

测试人

程序员 软件测试 测试开发 app自动化测试

墨天轮专访TDengine陶建辉:坚持做难而正确的事,三次创业成就不悔人生

墨天轮

数据库 tdengine Influxdb 时序数据库 国产数据库

ChatGPT 之后,B 端产品设计会迎来颠覆式革命吗?| Liga妙谈

LigaAI

交互设计 产品设计与思考 tob产品 ChatGPT 企业号 6 月 PK 榜

听说最近AI应用爆了?!来AI Studio玩转大模型应用

飞桨PaddlePaddle

百度飞桨

九科信息获评“第一新声”最佳信创企业管理软件,案例入选信创产业研究报告

九科Ninetech

大数据公司数据分析取数流程以及SQL示例

MobTech袤博科技

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