2017-01-25 3 views
1

私は述語を指定して待機条件を無効にすることができるため、クロノベースのタイマーよりもタイマーとしてcondition_variable::wait_forを使用することをお勧めします。そこで、待機プロセスが既に開始されてから遅延時間が変更されるかどうかを確認するためのテストプログラムを作成しました。 condition_variable::wait_forは変更を無視し、代わりに待機プロセスから完全に出てきます。どうしてこれなの?待っている途中で変更することはできますか?待機プロセス中にcondition_variable :: wait_for遅延パラメータが変更されたらどうなりますか?

template< class Rep, class Period > 
std::cv_status wait_for(std::unique_lock<std::mutex>& lock, 
         const std::chrono::duration<Rep, Period>& rel_time); 

さらに、wait_for()の仕様では何もありませんへの変更を示しています。あなたがin the specification of the wait_for() methodを見ることができるように

enum STATE {START,STOP,NONE}; 

STATE state ; 
condition_variable cv; 
mutex mu; 
chrono::milliseconds delay; 

void cv_wait_thread() 
{ 
    { 
     unique_lock<mutex> lock(mu); 
     cv.wait(lock, [](){ return state == START; }); 
    } 

    chrono::time_point<chrono::high_resolution_clock> start_time = chrono::high_resolution_clock::now(); 

    { 
     unique_lock<mutex> lock(mu); 
     cv.wait_for(lock, delay);  
    } 

    auto diff = chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_time); 


    cout << "Conditional_wait: "<< diff.count() << " milliseconds" << endl; 

} 


void main() 
{ 
    thread thread1([](){ cv_wait_thread(); }); 

    state = NONE; 

    this_thread::sleep_for(chrono::seconds(1)); 

    delay = chrono::milliseconds(3000); 

    state = START; 
    cv.notify_all(); // ask thread to sleep for 3 sec 

    this_thread::sleep_for(chrono::milliseconds(2000)); // let cv_wait thread start the wait process for at least 2 sec already 

    delay = chrono::milliseconds(5000); // ask thread to correct and sleep for 5 sec instead 

    cv.notify_all(); 

    thread1.join(); // thread prints 2000 milli 
} 

答えて

4

、遅延間隔はconstパラメータとして指定されていますパラメータは、wait_for()を実行しているスレッドによって観測可能です。

実際、ここでの唯一のシーケンシングは、根底にあるミューテックスの解放と再取得の間接的な結果になります。ただし、の後には、の指定されたタイムアウトが経過するまで発生しません。したがって、別のスレッドによって遅延パラメータに加えられた変更は、ではなく、となります。

メインスレッドが明示的に何かを実行しない限り、他のスレッドに対してdelayに変更を加えない限り、問題のスレッドがmutexをロックしてwait_for()を実行する以外の処理を行っていることに注意してください。これまでにdelayの新しい値を保証することが保証されています。

+0

総合的な返信をありがとうございます。しかし、遅延パラメータの値が変更された後に待機プロセスが中断する理由はまだ解明していません。第2の値ではないにしても元の値は全く取られませんでしたか? – ark1974

+0

これはあなたのコードがしたことだからです。 'wait_for()'は、条件変数が 'notify'()されたときか、タイムアウトが満了したときのどちらか早いほうに戻るときに戻ります。あなたのコードは 'notify'() - 条件変数を返します。したがって、' wait_for() 'が返されます。遅延値が変更されたかどうかは全く関係ありません。 –

関連する問題