2016-05-31 4 views
1

この質問が既に表示されている場合は、お詫び申し上げます。
すでに設定されている条件変数をクリアすることはできますか?私は以下を達成したいかについて
詳細:条件付き変数をリセットする(ブースト)

void worker_thread { 
    while (wait_for_conditional_variable_execute) { 
     // process data here 
     // Inform main thread that the data got processed 
     // Clear the conditional variable 'execute' 
    } 
} 

NOTE そのデータを処理しなければならないワーカースレッドが一度だけ、それが設定するメインスレッドを待つべきでは再び

を条件変数を「実行します」

私も

以下
void worker_thread { 
    while (wait_for_conditional_variable_execute) { 
     if (flag) { flag = 0; } 
     // process data here. The `flag` will be set by main thread 
     } 
} 

のようなフラグを持つ。しかし、私は、これはフラグのポーリングにすぎないとして、これはCPU集約的だろうと考えていますについて考えました。そうじゃない?

+0

私は _1のような詳細はほとんど言及していませんでした。ジョブが終了するたびに新しいスレッドを作成することはできません。 2.管理するスレッドが100個あるため、フラグのポーリングは受け入れられません_ – boomerang

+0

これを[tag:boost-thread]でタグ付けしたように、バージョンを使用していると仮定できますかC++のC++ 11よりも低いので、 'boost :: thread'と' boost :: condition_variable'を使用していますか? – Tas

+0

@Tas、yes ..私はC++を使用しています...ちょうど、私は 'boost :: thread'か' QThread'(QTプロジェクトなので)のどちらかをまだ決めていません。しかし、私は間違いなく 'boost :: condition_variable'を使用します。 – boomerang

答えて

1

はい。 wait()が呼び出されると、condition_variableはリセットされます。 wait()は、condition_variableになるまで現在のスレッドをブロックして、と言います。

ただし、condition_variableは間違っているようです。次に、あなたのメインスレッドであなたが持っていると思います

void processDataThread() 
{ 
    while (processData) 
    { 
     // Wait to be given data to process 
     cv.wait(); 
     // Finished waiting, so retrieve data to process 
     int n = getData(); 
     // Process data: 
     total += n; 
    } 
} 

を::

を代わりに

while (wait_for_conditional_variable_execute) 

を言うのあなたは本当にしたい。これは、次のような効果に何かを与えるだろう

while (thread_should_run) 
{ 
    // wait_for_conditional_variable_execute 
    cv.wait(); 
} 

を言います

addData(16); 
cv.notify_all(); 

スレッドデータを処理し、whileループを再入力し、condition_variableがトリガーされるのを待ちます。トリガーされると(つまり、notify()が呼び出されると)、スレッドはデータを処理してから再び待機します。

+0

ありがとう@Tas ..それは働いた!!私はここでこのクエリを投稿してうれしい!乾杯!! – boomerang

関連する問題