私には、タイムステップごとに1回ずつ、多くの小さな独立したタスクを実行する「メイン」機能があります。ただし、各タイムステップの後、すべてのタスクが完了するのを待ってから先に進む必要があります。
プログラムをマルチスレッドにしたい。ブーストオフシュートスレッドプールを使用した実装を試し、スレッドのベクトル(への共有ポインター)を使用してみました。また、asioスレッドプールのアイデアを試しました(io_serviceを使用し、作業を確立してから、実行をスレッドとio_serviceへの投稿ハンドラー)。
これらはすべて、私の「多くの小さなタスク」のスレッドの作成と破棄に多くのオーバーヘッドがあるようです。できればasioツールを使用して、1つのio_service、1つのthread_groupをインスタンス化し、ハンドラーをio_serviceに投稿して待機する方法が必要です。さらにタスクを投稿する前に、単一のタイムステップの作業を終了するため。これを行う良い方法はありますか?これが私が今働いているものの(取り除いた)コードです:
boost::asio::io_service io_service;
for(int theTime = 0; theTime != totalTime; ++theTime)
{
io_service.reset();
boost::thread_group threads;
// scoping to destroy the work object after work is finished being assigned
{
boost::asio::io_service::work work(io_service);
for (int i = 0; i < maxNumThreads; ++i)
{
threads.create_thread(boost::bind(&boost::asio::io_service::run,
&io_service));
}
for(int i = 0; i < numSmallTasks; ++i)
{
io_service.post(boost::bind(&process_data, i, theTime));
}
}
threads.join_all();
}
これが私がむしろ持っていたものです(しかし、実装する方法がわかりません):
boost::asio::io_service io_service;
boost::thread_group threads;
boost::asio::io_service::work work(io_service);
for (int i = 0; i < maxNumThreads; ++i)
{
threads.create_thread(boost::bind(&boost::asio::io_service::run,
&io_service));
}
for(int theTime = 0; theTime != totalTime; ++theTime)
{
for(int i = 0; i < numSmallTasks; ++i)
{
io_service.post(boost::bind(&process_data, i, theTime));
}
// wait here until all of these tasks are finished before looping
// **** how do I do this? *****
}
// destroy work later and join all threads later...