我们有一个注册回调的代码。因此,注册回调的流程不知道何时调用回调。
现在,该回调将被线程中的另一个流调用-因此,已注册该回调的主流程需要等待回调完成。
我不知道实现相同的方法,因为我无法在另一个将调用回调的线程中进行任何修改。在其他线程调用回调之后,如何使主线程同步响应?
答案 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
存储中,使用通常的局限性。