2016-12-10 13 views
0

私はboost :: lockfree :: queueを使ってマルチスレッドプログラムを書いており、コードは与えられた例とほとんど同じです http://www.boost.org/doc/libs/1_62_0/doc/html/lockfree/examples.html。さて、4つのキューがあり、データはintではなくstructです。boost :: lockfree :: queueは私のCPUを食べています

問題は、私のプログラムが実行時に私のCPUの95%を食べてしまい、それが非常に遅いということです。少し調査の後、私はブースト:: lockfree ::キュー::ポップがかかるため、これら二つのループ

while (!done) { 
    while (queue.pop(value)) 
     ++consumer_count; 
} 

のは驚くべきことではないCPU使用率の80%は私が何かできることがあることが分かりましたCPU使用量を減らすか、CPUをアップグレードする必要がありますか?私はブースト1.61、ビジュアルスタジオ2015をWindows 10、btwで使用しています。

ありがとうございました

+1

私はlockfreeキューの全体のポイントを見逃したと思います。あなたはおそらくブロッキングキューが必要です! lockfree/waitfreeキューのポイントは、キューに同時に読み書きするために必要な明示的なブロッキング同期がないことです。これにより、ロック競合のオーバーヘッドを回避し、予測可能な読み書きタイミングの動作を得ることができます。 あなたのスレッドは実際には時間をかけて動作し、決してブロックされません。それがあなたの望むものでない場合、つまり、キュー内で何かが利用できるようになるまで待機したい場合は、ブロックキューの実装を使用します。 – pokey909

答えて

0

あなたは何を期待しましたか?次のコードは、あなたが必要なものあなた(CPUを食べることに関して)

int counter = 0; 
bool condition_1 = false; 
bool condition_2 = false; 
while(!condition_1) { 
    while(!condition_2) { 
    ++counter; 
    condition_2 = true; 
    } 
} 

と同じであり、私見、いくつかの通知メカニズム(例えばcondition_variable)、ポール・キューです。さもなければ、それを絶えずポーリングして、明らかに、CPUを食べる。

関連する問題