Issue 148328
Summary std::condition_variable and std::condition_variable_any
Labels new issue
Assignees
Reporter johnsheu
    `wait_for()` and `wait_until()` for `std::condition_variable` and `std::condition_variable_any` take their wait duration or timeout parameters by const-reference.  This can lead to unexpected behavior if the referent changes while the `wait_for()` or `wait_until()` blocks.

For example:
```c++
  template <class _Clock, class _Duration>
  _LIBCPP_HIDE_FROM_ABI cv_status
 wait_until(unique_lock<mutex>& __lk, const chrono::time_point<_Clock, _Duration>& __t) {
    using namespace chrono;
    using __clock_tp_ns = time_point<_Clock, nanoseconds>;

    typename _Clock::time_point __now = _Clock::now();
    if (__t <= __now)
      return cv_status::timeout;

 __clock_tp_ns __t_ns = __clock_tp_ns(std::__safe_nanosecond_cast(__t.time_since_epoch()));

 __do_timed_wait(__lk, __t_ns);
    return _Clock::now() < __t ? cv_status::no_timeout : cv_status::timeout;
  }
```
The duration parameter `__t` is accessed by-reference, and so its value may be different before and after the wait.

For `std::condition_variable_any`, this is an actual data race if the timeout parameter is protected by the lock, as the implementation accesses the timeout outside of the lock.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to