0

次の例では、ブースト 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です。パフォーマンスに関しては、このような場合に複数のスレッドを持つことのポイントは何ですか?

4

1 に答える 1

1

スレッドと非同期 i/o は、パフォーマンスの最適化ではありません。これらは、レイテンシを隠すために使用される手法です。

質問 1: boost::bind は比較的安価です。関数オブジェクトを作成するだけです。スレッドの起動には非常にコストがかかります。スレッド間の同期はいくらか高価です (新しいスレッドを作成するほど高価ではありませんが、関数オブジェクトを作成するよりも高価です)。Strand.post() のような操作は、おそらく多くの同期を行っています (スレッド間で値を通信し、物事が特定の順序で確実に行われるようにします)。

質問 2: スレッド 2 (何らかの方法で最適化するのではなく、ライブラリがスレッドを作成すると仮定すると) は、スレッド 2 が PrintNum を呼び出す前に、スレッド 1 が処理を完了するのを待ってブロックします。

ほとんどの時間を互いのブロックに費やす場合、2 つのスレッドを使用しても意味がありません。

依存する操作のシーケンスは、ほとんどの場合、同じスレッドにマップする必要があります。(あなたのケースでは PrintNum(0); PrintNum(1) のように: 順番に実行したいので、同じスレッドに入れます。)

現在行っていることとはほぼ完全に無関係な何かをする必要がある場合にのみ、新しいスレッドを開始してください。たとえば、複数のユーザーまたはデバイスと接続するサーバーを作成しているとします。各ユーザーまたはデバイスは独自の速度で動作し、サービスを要求したり、サーバーからの質問に応答したりするため、各ユーザーまたはデバイスと対話するスレッドを作成する必要がある場合があります。そうすれば、1 人のユーザーが数分間離れても、他のすべてのユーザーは、離れているユーザーを待つことをブロックすることなく、スレッドと対話し続けることができます。ただし、個々のユーザーに対して実行するサービスは特定の順序で行われるため (「ユーザーが A を要求したので、A を検索し、何らかの処理を行ってからユーザーに送り返します」)、サービスを分割しないでください。 1 人のユーザーに対して別のスレッドで実行します。

于 2013-04-16T01:12:55.940 に答える