C ++等待回调在回调内完成

时间:2018-10-29 08:19:28

标签: c++ c++11

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

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

我不知道实现相同的方法,因为我无法在另一个将调用回调的线程中进行任何修改。在其他线程调用回调之后,如何使主线程同步响应?

1 个答案:

答案 0 :(得分:2)

您将需要在两者之间共享 some 状态,以便进行通信。

作为必然结果,如果回调是无状态的,则无法做到这一点(或仅在某些限制下,例如限制可以同时激活的回调的数量)。

由于对共享状态的访问可能同时发生在不同的线程中,因此所有访问都需要同步。成为线程安全的。

这是一个使用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存储中,使用通常的局限性。