次の例では、ブースト ASIO を使用しています。ここでは、スレッドの準備ができており、ジョブが実行されるのを常に待機しています。ジョブは常に線形に実行されます (私が理解しているように、ジョブがキューに格納されているかのように)。次のコード スニペットは私のポイントを説明しています.
void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service )
{
io_service->run();
}
void PrintNum( int x )
{
//Do somejon
}
boost::shared_ptr< boost::asio::io_service > io_service( new boost::asio::io_service);
boost::shared_ptr< boost::asio::io_service::work > work(new boost::asio::io_service::work( *io_service ));
boost::asio::io_service::strand strand( *io_service );
worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
//Give the thread (which is already active) some work to do
for(int i=0;i<2;i++)
{
strand.post( boost::bind( &PrintNum, i ) );
}
質問1
ここで私の質問は、上記の方法が独立したスレッドを起動するよりも高速で効率的かどうかです (たとえば、を使用してboost::thread
)。スレッドの起動などの独立したスレッドの場合、boost::thread
線形ではない可能性があります (スレッド 2 はスレッド 1 の前に実行される可能性があります)。私の質問は、関与するスレッドが1つしかない場合、どのメカニズムがより高速だったのでしょうか? boost::bind の eof によるオーバーヘッドはありますか
質問 2 上記の例では、作業を待機する 2 つのスレッド (スレッド 1 とスレッド 2) が起動されます。このように 2 つの作業を連続して行うと、正確にはどうなるか知りたいと思いました。
for(int i=0;i<2;i++)
{
strand.post( boost::bind( &PrintNum, i ) );
}
各スレッドは 1 つのジョブを取得しますが、スレッド 2 はスレッド 1 の前に完了しません。私の質問は、スレッド 1 が起動している間にスレッド 2 で何が起こるかということPrintNum
です。パフォーマンスに関しては、このような場合に複数のスレッドを持つことのポイントは何ですか?