Section: 32.7 [thread.condition] Status: Resolved Submitter: Switzerland Opened: 2010-08-25 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [thread.condition].
View all issues with Resolved status.
Discussion:
Addresses CH-29
It is unclear if a spurious wake-up during the loop and reentering
of the blocked state due to a repeated execution
of the loop will adjust the timer of the blocking with the
respect to the previously specified rel_time value.
[ Resolution proposed by ballot comment: ]
Make it clear (e.g. by a note) that when reexecuting the loop the waiting time when blocked will be adjusted with respect to the elapsed time of the previous loop executions.
[ 2010-08-13 Peter Sommerlad comments and provides wording: ]
Problem: It is unclear if a spurious wake-up during the loop and re-entering of the blocked state due to a repeated execution of the loop will adjust the timer of the blocking with the respect to the previously specified
Proposed Resolution from CH29: Make it clear (e.g. by a note) that when re-executing the loop the waiting time when blocked will be adjusted with respect to the elapsed time of the previous loop executions. Discussion in Rapperswil: Assuming the introduction of a mandatoryrel_timevalue.steady_clockproposed by US-181 to the FCD the specification ofcondition_variable::wait_forcan be defined in terms ofwait_untilusing thesteady_clock. This is also interleaving with US-181, because that touches the same paragraph (30.5.1 p 25, p34 and 30.5.2 p 20, p 28 in n3092.pdf) (The "as if" in the proposed solutions should be confirmed by the standardization terminology experts)
[ 2010-11 Batavia: Resolved by applying n3191 ]
- Change 32.7.4 [thread.condition.condvar] paragraph 25,
wait_forEffects as indicated:template <class Rep, class Period> cv_status wait_for(unique_lock<mutex>& lock, const chrono::duration<Rep, Period>& rel_time);[..]
25 Effects: as ifreturn wait_until(lock, chrono::steady_clock::now() + rel_time);
Atomically callslock.unlock()and blocks on*this.When unblocked, callslock.lock()(possibly blocking on the lock), then returns.The function will unblock when signaled by a call tonotify_one()or a call tonotify_all(), by the elapsed timerel_timepassing (30.2.4), or spuriously.If the function exits via an exception,lock.lock()shall be called prior to exiting the function scope.- Change 32.7.4 [thread.condition.condvar] paragraph 34,
wait_forwith predicate Effects as indicated:template <class Rep, class Period, class Predicate> bool wait_for(unique_lock<mutex>& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred);[..]
34 Effects: as ifreturn wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));
Executes a loop: Within the loop the function first evaluatespred()and exits the loop if the result istrue.Atomically callslock.unlock()and blocks on*this.When unblocked, callslock.lock()(possibly blocking on the lock).The function will unblock when signaled by a call tonotify_one()or a call tonotify_all(), by the elapsed timerel_timepassing (30.2.4), or spuriously.If the function exits via an exception,lock.lock()shall be called prior to exiting the function scope.The loop terminates whenpred()returnstrueor when the time duration specified byrel_timehas elapsed.- Change 32.7.5 [thread.condition.condvarany] paragraph 20,
wait_forEffects as indicated:template <class Lock, class Rep, class Period> cv_status wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time);20 Effects: as if
return wait_until(lock, chrono::steady_clock::now() + rel_time);
Atomically callslock.unlock()and blocks on*this.When unblocked, callslock.lock()(possibly blocking on the lock), then returns.The function will unblock when signaled by a call tonotify_one()or a call tonotify_all(), by the elapsed timerel_timepassing (30.2.4), or spuriously.If the function exits via an exception,lock.unlock()shall be called prior to exiting the function scope.- Change 32.7.5 [thread.condition.condvarany] paragraph 28,
wait_forwith predicate Effects as indicated:template <class Lock, class Rep, class Period, class Predicate> bool wait_for(Lock& lock, const chrono::duration<Rep, Period>& rel_time, Predicate pred);28 Effects: as if
return wait_until(lock, chrono::steady_clock::now() + rel_time, std::move(pred));
Executes a loop: Within the loop the function first evaluatespred()and exits the loop if the result istrue.Atomically callslock.unlock()and blocks on*this.When unblocked, callslock.lock()(possibly blocking on the lock).The function will unblock when signaled by a call tonotify_one()or a call tonotify_all(), by the elapsed timerel_timepassing (30.2.4), or spuriously.If the function exits via an exception,lock.unlock()shall be called prior to exiting the function scope.The loop terminates whenpred()returnstrueor when the time duration specified byrel_timehas elapsed.
Proposed resolution:
Resolved by n3191.