https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121237

            Bug ID: 121237
           Summary: Wrong return value of
                    `condition_variable_any::wait_until`
           Product: gcc
           Version: 15.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rohan at rohanlean dot de
  Target Milestone: ---

The `stop_token` overload of `condition_variable_any` can sometimes return a
wrong result.  The implementation in [thread.condvarany.intwait], paragraph 7,
always returns `pred()`:

```
while (!stoken.stop_requested()) {
   if (pred())
      return true;
   wait(lock);
}
return pred();
```

The libstdc++ implementation on the other hand can return `false` even if
`pred()` is `true`, if the wait is interrupted by the stop token:

```
      while (!__p())
        {
          bool __stop;
          {
            unique_lock<mutex> __my_lock(*__mutex);
            if (__stoken.stop_requested())
              {
                return false;
              }
            _Unlock<_Lock> __u(__lock);
            unique_lock<mutex> __my_lock2(std::move(__my_lock));
            const auto __status = _M_cond.wait_until(__my_lock2, __abs_time);
            __stop = (__status == std::cv_status::timeout) ||
__stoken.stop_requested();
          }
          if (__stop)
            {
              return __p();
            }
        }
      return true;
```

Reply via email to