c++回调函数的实现

  1. 关于协程的争论

golang 在中国大火的同时,也带火了另外一个概念,协程。个人认为协程之所以会火,其中一个原因就是协程在发生阻塞时能够主动把释放资源给其他协程去使用,在等待的资源满足后能够被重新调度回来,从而保证了机器资源的高效使用,同时使得开发者只要用编写同步代码就能实现异步编程的效果,避免了代码的支离破碎和call back hell。这固然是很美好的,但是在没有协程库的情况下,我们要怎样实现高性能的编程呢?一般的做法就是用线程池+任务回调。线程池的实现大家自行点链接查看,这里我们重点说说回调怎样做。

1、函数指针

用函数指针来实现函数回调应该是大多数同学马上想到的做法了,毕竟指针作为c/c++最强大的功能,就连linux内核中也大量用到了函数指针来实现回调。

2、使用多态

函数指针用起来固然简单,但是对于c++程序员而言,它并不完美,因为它无法指向成员函数。当然,我们可以把要回调的函数声明为static。不过既然都用到了类封装,那就坚持用到底好了。那我们要的回调又要怎样实现呢?没错,用多态。我们可以定义一个只包含若干个纯虚函数的接口类(这种类在java中叫Interface,我觉得这称呼会更加合理),然后每个具体类都继承这个接口类并且把这个类的指针传给回调者,回调者在回调的时候就能因为多态的特性实现调用对应的实现了。

关于协程的争论

在文章开头我用golang作为引子来起文章,结果引起了同学们的争论,我对golang的研究有限,另外,我也不是科学家,不想太去深究各位同学提到的grenn thread和goroutine还有协程之间的区别,或者说说有栈协程和无栈协程的区别,这对于做研究而言固然不够严谨,但是对于写代码而言,我个人认为知道线程和协程的根本区别已经足够了。至于线程和协程的根本区别,我的看法是资源控制的主动让出和恢复机制。线程的调度是由则是内核调度的,除非被内核中断了,否则不会主动让出资源,所以当需要等待某些资源时,线程只能被阻塞着,因此如果不想一直起新的线程,在资源等待比较多的场景下,一般会结合异步回调来使用,这也是为什么我会写本文的原因;而协程则是由语言自身语法或者库提供主动中断当接口来完成的调度。所以只要满足这个特性的,我一律归类为协程,不区分是有栈还是无栈。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wshten@gmail.com

文章标题:c++回调函数的实现

本文作者:KevinTen

发布时间:2019-08-30, 00:00:00

最后更新:2019-10-21, 20:41:21

原始链接:http://github.com/kevinten10/2019/08/30/CPlus/CP-callback/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

csdn zhihu github