私は述語を指定して待機条件を無効にすることができるため、クロノベースのタイマーよりもタイマーとして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
}
総合的な返信をありがとうございます。しかし、遅延パラメータの値が変更された後に待機プロセスが中断する理由はまだ解明していません。第2の値ではないにしても元の値は全く取られませんでしたか? – ark1974
これはあなたのコードがしたことだからです。 'wait_for()'は、条件変数が 'notify'()されたときか、タイムアウトが満了したときのどちらか早いほうに戻るときに戻ります。あなたのコードは 'notify'() - 条件変数を返します。したがって、' wait_for() 'が返されます。遅延値が変更されたかどうかは全く関係ありません。 –