Простейшая реализация для std::condition_variable::wait()
будет соответствовать занятому ожиданию :
template<typename Predicate>
void wait(std::unique_lock<std::mutex>& lck, Predicate pred) {
while (!pred()) {
lck.unlock();
lck.lock();
}
}
По этой причине ложных пробуждений может произойти.
Ваша реализация переводит поток в спящий режим между освобождением и получением блокировки мьютекса:
void wait(unique_lock<mutex> &lock) {
lock.unlock();
this_thread::sleep_for(15ms); // <--
lock.lock();
}
Однако найти правильный период ожидания может быть сложно. Чем оно ниже, тем больше оно похоже на занятое ожидание, и, следовательно, больше тратится циклов ЦП. Чем оно выше, тем меньше процессорных циклов тратится впустую, но тем хуже скорость отклика.
Как часто в вашей реализации происходят ложные пробуждения, зависит от выбора периода ожидания.