C++编程实践—异步分析

一、异步编程

异步编程在现代的软件开发中已经无法回避了。虽然在前面从各个角度对异步编程进行了分析和说明,并在多线程开发中实现了不少的异步编程的例子。但不得不说,异步编程作为一个所有语言通用的难度级别很高的编程方式,其难点不在其实现的手段机制,更重要的在设计和开发者的异步思想的水平。

二、异步思想

在日常生活中,经常会听到一些人,特别是老人说:“就不能干着一件事再做其它事,看看,又把锅烧干了。”这其实就是一种异步的机制。异步的机制往往出现在并行(发)中,所以异步思想往往也是解决并行(发)的一种基础思想。
在前面反复的分析过,计算机资源的有限性以及人类解决问题的无限性,导致了二者的冲突。异步编程就成为了一种高并发模式下提高性能的必要的手段。也就是说,如何从思想层次指出哪些方式更适合于异步编程,是解决异步编程开发的重要的指导。

三、引入异步

要想引入异步,从思想就要掌握以下几个原则:

  1. 多任务执行的非阻塞性
    正如多线程编程一样,异步多任务必须保证每个任务执行不能被阻塞,否则就回到了同步编程。但非阻塞也要保证任务结果的可获得性
  2. 多任务之间的合作性
    使用异步的目的是资源利用的高效率下完成任务,本质不是竞争是合作。即各个任务间互相协调配合,在有限的资源场景下最大程度的利用资源
  3. 异步编程的可抽象性
    这是异步编程的难点和复杂之处,它需要开发者能够理解任务间的协作调度,明白任务间的数据传递条件、限制运行条件以及并行的启停等等。在此基础上,开发者还要不断进行抽象,让异步编程的代码和同步编程的代码尽量保持宏观的一致性

通过上面的分析,就可以对照常见的异步机制进行对比,更容易理解上面的原则。常见的异步机制有:

  1. 事件机制
    这在Linux平台上最常见的一种机制,也就是事件循环机制,如epoll等
  2. 消息机制
    这种消息机制是一种广泛的概念,包括常见的系统消息、事件通知和MQ等。它的原理和事件机制的基本类似。比如Linux平台的各种消息机制以及常见的分布式的各种MQ
  3. 任务机制
    这种就属于基础的异步机制,即Task/Future。这在不同的编程语言中有不同的实现。C++中提供了Task与std::async
  4. 协程机制
    自从Go语言中正式引入了协程后,C++自然也不甘落后,在C++20中引入了协程。其关键字为co_await。协程在前面分析过,此处不展开

四、异步的实现

既有了实现机制,就需要明白异步编程的实际展现的方式。一般有以下几种:

  1. 回调函数
    这是传统的异步编程中,通过多线程实现异步操作的一种方式。它最基础,应用也最多
  2. promise和futuer
    C++11引了库,它提供了promise和futuer的异步封装机制,特别是std::async,让其变得更方便简单
  3. 协程
    协程可以说是目前异步编程的解决的最优方式。它解决了传统异步编程无法抽象到与同步机制相同的编程风格

五、常见的异步

在实践过程中,可以基本看以下几种异步编程的应用:

  1. 异步IO
    异步IO是开发者最常见的异步方式,如IOCP,epoll等用于网络编程的异步方式
  2. 异步拷贝
    大数据的拷贝往往意味着对任务的阻塞,所以在并行开发中,异步拷贝往往也是一个重要的提高性能的方式。在前面的CUDA编程中也有专门的异步拷贝的分析
  3. 异步回调
    回调函数的典型的应用,通过多线程中的任务异步完成后通过回调函数执行其它任务的调用
  4. 异步消息(通知、事件)
    这种也比较常见,通过消息等方式对不同的任务间进行协作调度和结果反馈等动作。比如Linux中的signal

六、未来发展

异步编程在未来一定会发展到与同步编程类似,更容易让开发者在代码层面进行理解和维护。但其内在机制的隐藏,有可能导致开发者在面对复杂任务出现的问题时,更难于解决。所以,未来对异步编程的调试、分析等机制的工具及IDE工具的支持,一定会广泛出现。
异步编程不是为了消灭同步编程而生的,这点一定要注意。它们是互补的,互相协同来解决不同的实际的问题的。还是那句话,合适的才是最好的。

七、总结

异步和同步是一对兄弟,理解了同步,就容易理解异步了。所以,在实际的学习和开发中,往往是从同步开始,学习各种同步机制。然后再理解异步的各种机制,最终提升开发者自己的异步编程思想。
异步编程的难不在于本身,而在于开发者设计思想的转换。思想转换了,编程就是一个学习和实践的过程。互相迭代几次,异步编程就算入门了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值