2011-10-26 5 views
2

共有メモリへの書き込みを待っているコードがあります。 誰も書き込みをしない場合、それは待ち続けます。boost scoped_lockでCPU使用量が多すぎる

Test* Foo::Get() 
    { 
     boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> lock (mutex) ; // mutex is boost::interprocess::interprocess_mutex 
     if (this->check == 0) 
      this->interprocessCondition.wait (lock) ; // interprocessCondition is boost::interprocess::interprocess_condition 

... 
    } 

私がサンプリングをしたとき、私はCPUの約90%を消費することが分かった。

このパフォーマンスの問題を解決するお手伝いがありますか?添付の画像をご覧ください。

Screen Shot

+0

他に何かしているのですか、ロックをプロファイリングしていますか? 「何か他のもの」のコードはどのように見えますか? –

+0

それはちょうど何かの共有メモリからの読み込みです。私は完全な実行可能ファイルをプロファイルしました。 – MacGeek

+2

それはあまり役に立ちません。共有メモリーからintを読み取るよりも、ロックを取って*ロット*多くのCPUを取るのが普通です。ロックを細かくすることで解決します。 –

答えて

6

boost::interprocess、残念ながら、(明らかにOSXを含む)多くのプラットフォーム上でのロックのためにビジー待機を使用しています。あなたは実際に眠っているあなたのプラットフォームに固有のロックを使いたいでしょう。

+0

または幸いにも、それはあなたが達成したいものに依存します。 –

+0

sched_yield()の代わりにsleep(1)を追加しました。コール?今は非常にかわいい。それは、私はブーストの更新コードを妨害しないように見なければならないが、副作用があるのだろうか? – MacGeek

+0

@MacGeek、これは目覚ましの待ち時間を大幅に増加させます – bdonlan

関連する問題