2012-01-31 4 views
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); 
    } 
}; 

だから私はこだわっています...私が永遠に待つか、各スレッドで現在実行中のジョブの後にキューを遮断するかと思われます。私がドキュメントにないものがなければなりませんか?

+1

'io_service ::実行()は'ご希望の動作である、戻ります。質問はなぜ 'run()'へのあなたの呼び出しが永遠にブロックされるのでしょうか? – nabulke

+0

OK。私はio_serviceでsignal_setも登録しました。シグナルセットを削除すると、 'm_io_service.run()'を使って宣伝されたように動作します。 – hannes

+1

http://stackoverflow.com/a/7957296/369872 – David

答えて

0

このアイデアは動作するはずのドキュメント(擬似コード)によると:すべての作業が終了したときに

... 

// put a few handlers into io_service 

... 

// don't forget to destroy all boost::asio::io_service::work objects 
while (m_io_service.stopped()) 
{ 
m_io_service.run(); 
} 

// when code reaches this line m_io_service will be in stopped state and all handlers will be executed 

// this code can be called without any doubts about being locked 

m_threads.join_all(); 
関連する問題