引言

首先说说在单核时代,异步回调应该也没有人会去使用,因为从CPU执行上来说异步回调除了不像同步回调那样执行时阻塞(阻止后面代码执行,即仍处于调用callback的线程的上下文中)外,可能与同步回调也差不多,最多可能做到一个关注点的分离,这意味着在单核时代我们几乎总是使用同步回调.但随着多核时代的到来,异步的优势慢慢体现,接下来就简单谈谈这两者之间的区别.

孰优孰劣

首先对于这两种方式本身来说没有一种是"更优"于另一种的,它们都有更适合于自己的场景,并不能一概而论,

同步回调

  1. 可以无竞争的访问线程本身的元素,比如thread_local,或者线程栈上元素.
  2. 触发回调和回调执行是同一个线程,不需要关系线程安全,直接执行函数即可.
  3. 代码编写简单

异步回调

  1. 触发回调和回调执行并不是一个线程,需要注意DataRace,需要我们进行指定执行顺序(互斥锁或指定内存序以到达同步).
  2. 不能访问thread_loacl和栈上元素
  3. 对于执行callback的线程来说的性能提升,异步回调意味着我们可以把耗时的IO操作全部放到其他线程执行,而我们本身的时间循环可以继续执行正常的逻辑,以此提升并发量.

有一句话很有意思,即同步回调 (sync callback) 在 构造闭包 的 调用栈 (call stack) 里 局部执行,这意味着同步回调中上下文的寿命一般长于用lambda表达式捕获后构造的回调,这使得我们不必担心捕获对象的生命周期问题,而异步回调往往闭包的寿命长过调用栈的长度,这使得其中捕获的对象可能在函数执行时已经死亡,同时对象也可能泄露,这类问题是有一个通解的,即shared_ptr/weak_ptr.

关于回调中对象的所有权问题有一点值得讨论,即强引用(strong reference),这时闭包是拥有对象的所有权的,闭包何时被销毁,对象也何时被销毁,这用在我们希望回调执行时捕获对象总是有效.例子是用bind捕获shared_ptr,此时shared_ptr的生命周期等同于bind产生的对象(外界不存在引用计数的话).

所以我们不能一概的指出到底哪一个更好,举个简单的例子

std::foreach(callback);

此时这就是一个同步回调,在这种场景下我们也兵不需要异步回调.

while(Event_Driven_loop){if(connectionEvent){//dosomething}else if(IOEvent Event){blockingqueue.push(Event);}else if(CalculateEvent Event){blockingqueue.push(Event);}...
}

以上是一个事件驱动的循环,根据事件类型来执行不同的代码,当遇到计算任务和IO任务的时候,费时的操作我们可以扔到一个阻塞队列或者类似的工具中,这就是一个典型的异步回调,这样的好处时费时的操作可以不在宝贵的时间循环中进行,而开辟出专门的线程去做这件事,以此提升并发潜力.想象以下如果这个我们改成一个同步回调,那么如果在Event中有一个费时的操作,文件IO也好,DNS解析也好,又或是一个花费半秒的计算任务,这对于一个高性能的服务器来说是不可忍受的.

最后就是其实同步回调和异步回调本身实现的东西让人感觉和模板模式(同步),观察者模式(异步)很类似,都是通过注册回调去实现复用和扩展,无非是使用了不同的方式而已,其实做到的事情都差不多,按照OS的设计理念来说就是机制与策略相分离。

而观察者模式又和责任链模式很类似,前者给人的感觉像是特殊的责任链模式(甚至可以组织成一个观察者链,与责任链的区别 就是消息是否可变),当然前者更偏向于观察者(订阅者)状态的改变,后者更偏向于链中的逻辑执行。所以很多时候私以为不要陷入理论的束缚,而是从实际出发,不然就有些本末倒置的感觉了。

总结

其实大可不必纠结名词的含义,根据上面两个例子我们可以看出这其实就是问题的两种解决方案,各有优劣而已,无非是时机不同我们所的需求不同罢了.

参考:

  1. https://blog.csdn.net/yunnysunny/article/details/44726963
  2. 再谈回调 一篇好文
  3. 极客时间 设计模式之美

同步回调与异步回调区别相关推荐

  1. C++屌屌的观察者模式-同步回调和异步回调

    目录 一.概述 1.同步观察者 2.异步观察者 二.效果展示 三.同步观察者 四.异步观察者 五.相关文章 原文链接:C++屌屌的观察者模式-同步回调和异步回调 一.概述 说起观察者模式,也是比较简单 ...

  2. 关于js的回调函数,同步回调与异步回调

    回调定义 刚开始学习javascript时,对回调函数的理解仅仅停留在知道定义阶段.什么是回调函数? 就是将一个函数作为参数传递给另一个函数,作为参数的这个函数就是回调函数. 至于为什么要用到回调函数 ...

  3. 理解支付宝同步回调和异步回调

    支付宝同步回调和异步回调 当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果.但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用. 很多新手会拿这个结果 当作支付成功了,那就会被 ...

  4. Java回调函数异步回调案例

    1.回调函数分类 回调函数区分:同步回调和异步回调 同步回调:意义只在于完成方法调用: 异步调用:可实现并发,主业务线程可以及时释放:异步线程完成工作,执行回调函数,完成善后工作:提高了执行效率. 2 ...

  5. (87)FPGA面试题-同步FIFO与异步FIFO区别?异步FIFO代码设计

    1.1 FPGA面试题-同步FIFO与异步FIFO区别?异步FIFO代码设计 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-同步FIFO与异步FIFO区 ...

  6. 同步调制和异步调制区别

    在PWM控制电路中,载波频率 fc 和调制信号频率 fr 之比成为载波比,根据载波信号和信号波信号是否同步分为同步调制和异步调制. 1 什么是异步调制? 载波信号和调制信号不保持同步的方式称为异步调制 ...

  7. 回调函数 相当于线程_C++屌屌的观察者模式-同步回调和异步回调

    一.概述 说起观察者模式,也是比较简单的一种模式了,稍微工作有1年经验的同学,写起来都是666... 想看观察者模式的说明可以直接上菜鸟教程|观察者模式这个地址去看. 本篇文章其实就是一个简单的观察者 ...

  8. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  9. Java接口回调,异步回调理解

    文章目录 前言 一.回调简单理解 二.Java中用接口实现回调 1.实现接口回调 1.1同步回调 1.2 异步回调 2.为啥要用接口实现 3.关于接口(基础) 总结 前言 本文是作者在学习接口回调时看 ...

  10. 同步中断和异步中断区别

    原网址:https://blog.csdn.net/nolatin/article/details/8243430 中断有两种,一种是CPU本身在执行程序的过程中产生的,一种是由CPU外部产生的. 外 ...

最新文章

  1. PopupWindow响应返回键的问题
  2. 【Java基础】对象拷贝
  3. (0067)iOS开发之iOS新增类UILayoutGuide的用途
  4. caffe命令及其参数解析
  5. 什么是 NIO? NIO 和 BIO、AIO 之间的区别是什么?NIO主要用来解决什么问题?
  6. Atitit 长距离无线通信法 LoRa NB-IoT NB-CIoT LoRa是Semtech公司的创新发明,该技术向用户提供显著的长距离、低功耗、安全数据传输机制。使用LoRa技术构建的公用网
  7. Bullzip PDF Printer 打印机驱动安装失败解决
  8. JanusGraph快速开始
  9. 关于人工智能的思考--以copilot、openAI为例
  10. vue三级路由router-view不显示问题,路由嵌套不显示
  11. rs_D455相机内外参标定+imu联合标定
  12. Windows 解决端口占用
  13. 20-观察者模式Quarkus实现
  14. java设备imei号_java 怎么计算IMEI号码正确性
  15. 【BZOJ5498】[十二省联考2019]皮配(动态规划)
  16. 网站是不是php是什么意思,php网站是什么意思?
  17. 为程序添加windows注册表
  18. VM15中安装Linux
  19. 安卓数据转移到iphone老是中断_如何把安卓手机上的数据转移到 iPhone、iPad?
  20. flask学习:开发一个微电影网站一:项目介绍

热门文章

  1. Modem2G/3G/4G/5G:高通平台SUPL配置方法总结
  2. 业务与信令-第6章VoLTE信令
  3. 微信小程序实验一 ——— 简单计算器与秒表
  4. BZOJ 4807(車-高精度)
  5. 电阻触摸屏和电容触摸屏你更喜欢哪一个?
  6. Nature指数全球城市科研排名:北京第一,上海第五,南京第八
  7. 统计数据会说谎_统计数据对您说谎的三种方式
  8. Elite Software DuctSize v6.01.224 1CD(风管测算软件)
  9. 数据结构之时间复杂度的计算
  10. 车站计算机系统的简称,AFC计算机系统.ppt