首页 > 解决方案 > C++ 等待回调在回调中完成

问题描述

我们有一个注册回调的代码。因此,注册回调的流程不知道何时调用回调。

现在回调将由线程中的另一个流调用 - 因此已注册回调的主流需要等待回调完成。

我不知道要实现相同的功能,因为我无法修改其他线程中将调用回调的任何内容。如何让我的主线程同步响应 - 在其他线程调用回调之后?

标签: c++c++11

解决方案


您将需要在两者之间共享一些可用于传达此信息的状态。

作为推论,如果回调是无状态的,则无法做到这一点(或仅在某些限制范围内,例如限制可以同时活动的回调数量)。

由于对该共享状态的访问可能同时从不同的线程发生,因此所有访问都需要同步,即。使线程安全。

这是一个使用的简单示例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存储中,但通常会产生限制。


推荐阅读