そこで、カスタム スレッドで C++ で同期イベント キューを作成したいと考えています。私が知る限り、boost::asio::strand はこれの優れた候補ですが、1 つのひねりがあります。asio::run() が呼び出されると、ストランドのキューにイベントがある間だけ実行されます。コード:
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 the handler queue is empty?の答えに行くことができました。、しかし、これには while-loop-wait が含まれています。もっとイベントベースにしたいです(別名、キューが空のときにwhileルックで「ラップ」呼び出しを待ちます)。これを行うと考えることができる唯一の方法は、ストランド クラスを完全にラップし、「ラップ」が呼び出されるたびにシグナルをトリガーすることです (疑似コードのようなもの)。
//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 ループなしでキューが永久に実行されます (私の同期は少しずれていますが、それは問題ではありません)。より良い、より標準的な方法はありますか?