C++回调

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<>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值