1

ユーザーがデータを送信すると、データベースに書き込まれる Web インターフェイスがあります。バックグラウンドでは、データベースに新しいエントリがないか定期的にチェックする C++ プログラムがあります。次に、これらのエントリを取得して処理し、その結果をディレクトリに書き込みます。その後、スリープ状態になり、処理する新しいエントリをチェックし続けます。

私の質問は、C++ プログラムにマルチスレッドを追加することに関するものです。別のジョブを実行する必要があるたびに新しいスレッドを作成するのではなく、ジョブをキューに追加して、既に作成されている固定数のスレッドに分散させるのは一般的に悪い考えであると読みました (たとえば、 5程度)。これは私の状況で取るべき適切な設計ルートですか? また、pthread_join を正しく理解していれば、実際に呼び出す必要はありません。すべてのジョブが完了するのを待ってから、データベースへの新しい更新をチェックし続ける必要がないからです。

正しい方向に向かっていることを確認したかっただけです。肯定/批判/リソースはありますか?

4

2 に答える 2

2

最初に、複数のスレッドが必要かどうかを判断する必要があります。データベースをチェックし、特定の間隔でファイルを書き込むことは、1 つのスレッドのみを使用して実行できるようです。複数のファイルに異なるデータを不規則な間隔で同時に書き込む必要がある場合は、複数のスレッドが役立ちます。並べ替えのキューを使用することが、これらの「ジョブ」をスレッドに分散するための最良の方法であり、スレッド プールを使用すると、任意の時点で同時に実行する「ジョブ」の数をもう少し制御できることは正しいです。時間。pthread_join メソッドは、あるスレッドが別のスレッドの前に終了しないようにする場合に使用されます。私はこれを主に、スレッド プールの作成後にプログラムの初期スレッドが終了しないようにするために使用しました。親スレッドが終了すると、プログラムの実行が停止します。以下の私のコメントに基づくいくつかの疑似コード。

メインスレッド:

spawn child threads
while(some exit condition){
   check database for new jobs
   if(new jobs){
      acquire job queue mutex //mutexes ensures only one thread accesses shared 
      add job to queue        //data at a time
      signal on shared condition variable
      release job queue mutex 
   }
   sleep(some regular duration)
}

子スレッド:

while(some exit condition){
   acquire job queue mutex
   if(job queue's size == 0){
      wait on the shared condition variable
   }
   grab job from queue
   release job queue mutex
   handle job
}

pthread/mutex/CV の使用上の注意については、こちらを参照してください。

于 2012-07-31T00:03:04.613 に答える
1

私の経験では、スレッドの作成にはおそらく数十ミリ秒かかります。あなたの時代のコンピューターにとって、これは大したことではありません。頻繁に作成/破棄されても、悪いことは何も起こりません。シンプルで完璧なアプリ レベルのデザインを探すことの方が重要かもしれません。

考えられる変形として、使用可能な CPU コアごとに 1 つのスレッドという、スレッドのプールを検討することをお勧めします。これらのスレッドは、ループの最後で単純にスリープし、何かすることがあるかどうかを定期的に確認する必要があります。

この単純化された設計により、最小限のオーバーヘッドが追加され、利用可能なすべての CPU パワーを同時に使用できます。

私の2セント。

于 2012-07-30T23:51:37.057 に答える