1

所以我想在自定义线程上用 C++ 创建一个同步事件队列。据我所知, boost::asio::strand 是一个很好的候选者,有一个转折:当 asio::run() 被调用时,它只在 strand 的队列中有事件时运行。编码:

this->control_strand_.reset(new boost::asio::strand(control_io_service_));
control_thread_ = boost::thread(boost::bind(&boost::asio::io_service::run,&control_io_service_));
control_thread_.join();

立即返回。现在我可以回答Boost Asio - How to know when handler queue is empty? ,但是这里面有一个while-loop-wait。我宁愿让它更多地基于事件(又名,当队列为空时,在 while 中等待“包装”调用)。我能想到的唯一方法是完全包装 strand 类,让它在调用“wrap”时触发一个信号(类似于伪代码)

//some member variables
boost::condition_variable cond_var;
boost::mutex mut;
std::unique_ptr<boost::asio::strand> control_strand_;
boost::asio::io_service control_io_service_
//while loop,running on event processing thread
void MessageProcessor()
{
  while (true)
  {
    {
      boost::unique_lock<boost::mutex> lock(mut);
      cond_var.wait(lock);
    }
    control_io_service_.run();
  }
}
//post call,from different thread
template <typename Handler>
void wrap(Handler hand)
{
  cond_var.notify_all();
  control_strand_->wrap(hand);
}

这将在没有while循环的情况下永远运行队列(我的同步有点偏离,但这不是问题atm)。有没有更好、更标准的方法?

4

1 回答 1

3

你可以io_service直接使用,它实现了一个“隐式链”。要让它继续运行,只需给它io_service::work一个对象,就像在io_service 参考中一样(请参阅“停止 io_service 从工作结束”)。

请注意,这io_service是故意线程安全的,因此您可以post()从外部线程对其进行仿函数。

于 2013-07-23T17:56:53.820 回答