c++ - C++ 等待回调在回调中完成
问题描述
我们有一个注册回调的代码。因此,注册回调的流程不知道何时调用回调。
现在回调将由线程中的另一个流调用 - 因此已注册回调的主流需要等待回调完成。
我不知道要实现相同的功能,因为我无法修改其他线程中将调用回调的任何内容。如何让我的主线程同步响应 - 在其他线程调用回调之后?
解决方案
您将需要在两者之间共享一些可用于传达此信息的状态。
作为推论,如果回调是无状态的,则无法做到这一点(或仅在某些限制范围内,例如限制可以同时活动的回调数量)。
由于对该共享状态的访问可能同时从不同的线程发生,因此所有访问都需要同步,即。使线程安全。
这是一个使用的简单示例std::future
:
#include <future>
// [...]
std::promise<void> p;
do_work_async([&p]() { p.set_value(); });
std::future<void> f = p.get_future();
f.get(); // this line will block until the callback is executed
请注意,这有潜在的生命周期问题:在回调执行之前,promise 需要保持活动状态。根据您的程序,这可能需要将承诺放在堆上。
如果不支持无状态回调(例如,回调参数必须是一个普通的 C 函数指针,并且没有提供用户状态的注入点),则需要将共享状态放入static
存储中,但通常会产生限制。
推荐阅读
- angular - 如何将数据传递到角度材料底页
- xamarin.forms - 构建具有多个列表视图的食谱页面
- ruby-on-rails - 如何访问 json 响应导轨中的值?
- python - 简单的张量流示例:
- pdf - Ghostscript在一页上添加一个,避免处理所有页面(出于速度原因)?
- javascript - 节点“require”语法创建模块的新引用
- javascript - 如何将 setTimeout 操作更改为 requestAnimationFrame?
- java - Weblogic 和 log4j
- devops - 从应用中心将多个应用导出到 Application Insights
- mysql - 使用日期列获取最小值和最大值的最有效方法