文章目录
C++回调
解释回调
wiki:可执行代码作为参数传入其他的可执行代码,并由其他可执行代码执行这段代码
回调的设计
同步回调
int compare (const void * a, const void * b) {
return (*(int*) a - *(int*) b);
}
...
int values[] = { 20, 10, 50, 30, 60, 40 };
qsort (values, sizeof (values) / sizeof (int), sizeof(int), compare);
qsort中所有compare执行完毕,调用结束,被称为同步回调
异步回调
void block_interrupt (int code) { printf("\rPress ^C\n"); }
...
signal (SIGINT, block_interrupt);
同步和异步方式的不同
同步方式:
通过 参数(例如 qsort 的最后一个参数)传递回调函数
调用者 立即调用 回调函数(调用时刻 在函数返回前)
此处的 qsort 和 compare 调用栈相同
异步方式:
通过 注册(例如 signal 函数)设置回调函数
调用者 先存储 回调函数,在未来的某个 调用时刻,取出并调用 回调函数
此处的 signal 和 block_interrupt 调用栈不同
闭包
回调是一个调用函数的过程,涉及两个角色:计算和数据。其中,回调的计算是一个函数,而回调的数据来源于两部分:
绑定 (bound) 的数据,即回调的 上下文
未绑定 (unbound) 的数据,即执行回调时需要额外传入的数据
捕获了上下文的回调函数就成为了闭包,即 闭包 = 函数 + 上下文。
1.1 回调时(弱引用)上下文会不会失效
由于闭包没有 弱引用上下文 的所有权,所以上下文可能失效:
对于 同步回调,上下文的 生命周期往往比闭包长,一般不失效
而在 异步回调 调用时,上下文可能已经失效了
1.2 如何处理失效的(弱引用)上下文
传递对象的弱引用指针,base::WeakPtr<>