2011-07-17 1 views
3
boost::condition cond; 
boost::recursive_mutex mutex; 

for(;;) 
{ 
    D * d = nullptr; 

    while(cb.pop(d)) 
    { 

    } 

    boost::lock_guard<boost::recursive_mutex> lock(**mutex**); 
    cond.wait(**mutex**); 
} 


while(1) 
{ 
    getchar(); 

    for(int i = 0 ; i < 1000 ; ++i) 
    { 
     cb.push(new D(i));   
     boost::lock_guard<boost::recursive_mutex> lock(**mutex**); 
     cond.notify_one(); 
    } 
} 

私の疑問はミューテックスについてですが、私はミューテックスオブジェクトだけが必要ですか?boost :: wait boost :: conditionの正しい使い方

EDIT:

CBは循環バッファです。 一種のプロデューサ - コンシューマパターンを実装したい

私はwaitとnotify_oneに同じmutexを使用する必要がありますか?

+0

あなたは何をしようとしていますか? cbとは何ですか?これらの無限ループはなぜですか? – bdonlan

+1

ああ、 'nullptr'のための+1: – bdonlan

答えて

6

参照してください。

cond.wait(mutex)を呼び出すとコードがコンパイルされますが、コードがコンパイルされるはずですが、mutexを再帰的にロックすると、おそらくデッドロックになります。

私が代わりにお勧め:

boost::condition_variable cond; 
boost::mutex mutex; 

// In one thread 

for(;;) 
{ 
    D * d = nullptr; 

    boost::unique_lock<boost::mutex> lock(mutex); 
    while(cb.pop(d)) 
    { 

    } 
    while (cb.empty()) 
     cond.wait(lock); 
} 

// In another thread 

while(1) 
{ 
    getchar(); 

    for(int i = 0 ; i < 1000 ; ++i) 
    { 
     boost::lock_guard<boost::mutex> lock(mutex); 
     cb.push(new D(i));   
     cond.notify_one(); 
    } 
} 

そして、あなたの実装がサポートしている場合は、boostためstdに置き換えてください。これは:

  1. 再帰的なミューテックスを使用しません。再帰的にロックしようとしないでください。
  2. コンテナへのアクセスを保護するためにmutexを使用します。cb
  3. 偽のウェークアップを防ぐために、あなたの周りにwhileループを使用します。
  4. より高価な(そしてより柔軟な)condition_variable_anyの代わりにはるかに安いcondition_variableを使用します。私はあなたの例で後者の必要性を見ていないよ。
+0

デザインの直接的な欠点は、ストリーミング・アルゴのコンシューマ・ポップ・ケースがやや効率的ではないのに、プロデューサがプッシュするのをブロックすることです? – Guillaume07

+0

'cb 'を非同期アクセスから保護する必要がない場合は、必ずmutexの保護下から移動してください。あなたの 'cb'がそうするかどうかは分かりません。私の主なポイントは、 'condition_variable_any'を使って再帰的にロックされたmutexを待つことを望まないということです。 –

+0

はい実際には必要ありません。ok私はcondition_variableを見ていきます。あなたの答えに感謝します。ああ、終了するには、boost :: recursive_mutexは、boost :: mutexよりも本当に時間がかかりますか? – Guillaume07

0

正しい - 1つのミューテックスが必要です。その目的は、複数の消費者があなたの1人のプロデューサーに敬意を持って同期することを確認することです。また

は、boost::condition私はstd::condition_variable_anyと同じものであると考えていboost::condition_variable_anyと同じものであり、あなたはブーストの最新バージョンを使用していると仮定すると、http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html

関連する問題