3
私は、一度作成したオブジェクトがバックグラウンドで多くのタスクを実行しますが、/ all/postedタスクが終了するまでブロックする必要があります。すなわち:Boost Asio:thread_groupが投稿されたすべてのタスクを処理するまで待っていますか?
struct run_many{
boost::asio::io_service m_io_service;
boost::thread_group m_threads;
boost::asio::signal_set m_signals;
void evaluate(std::string work, int i){ /*...*/ }
void run_tasks(int tasks, std::string work){
{
boost::asio::io_service::work w(m_io_service); //
for(int i=0;i<tasks;i++)
m_io_service.post(boost::bind(&run_many::evaluate, this, work, i));
}
//m_io_service.run(); // blocks forever
m_io_service.stop(); // seems to cut off queued jobs
m_threads.join_all(); // works only after m_io_service.stop()
}
run_many(int n_workers)
{
m_threads.create_thread(boost::bind(&boost::asio::io_service::run,m_io_service);
}
};
だから私はこだわっています...私が永遠に待つか、各スレッドで現在実行中のジョブの後にキューを遮断するかと思われます。私がドキュメントにないものがなければなりませんか?
'io_service ::実行()は'ご希望の動作である、戻ります。質問はなぜ 'run()'へのあなたの呼び出しが永遠にブロックされるのでしょうか? – nabulke
OK。私はio_serviceでsignal_setも登録しました。シグナルセットを削除すると、 'm_io_service.run()'を使って宣伝されたように動作します。 – hannes
http://stackoverflow.com/a/7957296/369872 – David