Boost.Asio的。期望在队列中完成任何对象的可能性是必要的

时间:2010-10-02 11:37:59

标签: boost boost-asio

在asio :: io_service中插入对象。 asio :: io_service :: run()在多个线程中运行。 期望在队列中完成任何对象的可能性是必要的。 例如:

template <typename T>
struct handler {
   void operator()() {
      ....
   }
   T get() const {...}
};

asio::io_service ios;
ios.post(handler());
  1. 如何引用队列中的对象?
  2. 如何暂停主程序循环,直到执行handler :: operator()?
  3. 感谢。

1 个答案:

答案 0 :(得分:1)

到目前为止我所知道的是:
1.几个处理程序正在多个线程上执行 2.处理程序彼此独立运行。数据/竞争条件的线程之间不需要同步 3.可以在任何处理程序上调用Get。当调用处理程序时应该停止计算并让另一个线程调用handler :: get()。

这看起来更像是一个多线程/并发问题,然后是一个boost :: asio问题。目前我认为不需要使用io_service。看起来几个线程可以在没有io_service的情况下启动,并且可以在线程之间使用一些同步。

调用Handler :: get()的线程需要等到运行operator()的io_service线程完成计算才能返回。

考虑使用条件变量。 handler :: get()方法可以等到条件满足(即operator()完成其计算)。运行operator()的io_service线程将通过条件变量通知主线程。

通过条件变量通知另一个线程的一个线程的示例是here