callback是什么意思?
回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过参数将函数传递到其它代码的,某一块可执行代码的引用。
这一设计允许了底层代码调用在高层定义的子程序。
回调的用途十分广泛。例如,假设有一个函数,其功能为读取配置文件并由文件内容设置对应的选项。
若这些选项由散列值所标记,则让这个函数接受一个回调会使得程序设计更加灵活:函数的调用者可以使用所希望的散列算法,该算法由一个将选项名转变为散列值的回调函数实现;因此,回调允许函数调用者在运行时调整原始函数的行为。
回调的另一种用途在于处理信号或者类似物。例如一个POSIX程序可能在收到SIGTERM信号时不愿立即终止;为了保证一切运行良好,该程序可以将清理函数注册为SIGTERM信号对应的回调。
回调亦可以用于控制一个函数是否作为:Xlib允许自定义的谓词用于决定程序是否希望处理特定的事件。
有两种类型的回调,它们在运行时控制数据流的方式不同:阻塞回调(也称为同步回调或仅回调)和延迟回调(也称为异步回调)。
在函数返回之前调用阻塞回调(在下面的 C 示例中,它说明了阻塞回调,它是函数main),则可以在函数返回后调用延迟回调。延迟回调通常用于 I/O 操作或事件处理的上下文中,并且在多个线程的情况下由中断或不同的线程调用。
由于其性质,阻塞回调可以在没有中断或多线程的情况下工作,这意味着阻塞回调通常不用于同步或将工作委托给另一个线程。
回调用于在窗口系统中对应用程序进行编程。在这种情况下,应用程序提供(引用)一个特定的自定义回调函数供操作系统调用,然后操作系统调用此特定于应用程序的函数以响应鼠标单击或按键等事件。
这里的一个主要问题是权限和安全性的管理:虽然该函数是从操作系统调用的,但它不应以与系统相同的权限运行。这个问题的解决方案是使用保护环。
回调函数在实际中有许多作用。
假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑。
回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。
那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer来通知A程序。如果没有提供回调函数,它还会把一个消息发往程序的消息队列。
另一个使用回调机制的API函数是EnumWindow,它枚举屏幕上所有的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。
EnumWindow并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
C语言的回调函数只能通过函数指针实现,在C++中则可以使用匿名函数(lambda)或仿函数(functor)作为回调函数。