【问题标题】:C++11 std::async CallbackC++11 std::async 回调
【发布时间】:2019-01-15 12:46:06
【问题描述】:

我想实现一个查询数据库并异步执行查询的对象。

假设我们有一个要查询的对象 A 使用对象 B。A 调用 B 的 executeQuery 方法并开始做任何其他事情。 B 的 ExecuteQuery 方法是异步的,对 quini A 来说是非阻塞的。当查询的结果准备好时,我希望它在 B 中通过回调通知给 A,以便 A 只有在准备好时才能去读取结果。

在 C++ 11 中实现这种机制的最佳方式是什么?

我用 std::async 尝试过,而是在 std::future 中读取结果我想在我的 std::future 已经包含结果时接收回调,从而避免我的调用成为阻塞器。

谢谢

【问题讨论】:

  • “quini A 的非阻塞” ?
  • 抱歉出错了.. "B 的 ExecuteQuery 方法不能对 A 阻塞"
  • 请使用“编辑”链接来修正问题,不要只是添加带有更正的评论。

标签: c++ c++11 callback stdasync


【解决方案1】:

当你有未来时,你可以使用 .wait() 等待执行完成,或者你可以使用 boost::mutex 在某个事件发生时向其他线程发出信号,然后让一些事件函数对其进行操作.

但我认为您可能需要设置老式回调函数 - 只需将函数指针传递给您的 ExecuteQuery 函数,然后让它调用它

【讨论】:

    【解决方案2】:

    你可以传递一个指向函数的指针并执行它。

    或将 std::future 与 std::async 一起使用

    您应该使用 wait_for 函数而不是 wait。并检查结果是否就绪。

    您还可以在异步函数结束时设置原子布尔值。并在主线程中检查这个布尔值。

    https://en.cppreference.com/w/cpp/thread/future/wait_for

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多