Как часто ложные сигналы срабатывают в условной переменной? - PullRequest
2 голосов
/ 18 февраля 2020

Я не понимаю, почему std :: condition_variable имеет больше стандартных гарантий, чем этот код:

class condition_variable {
public:
  void notify_one() {}
  void notify_all() {}
  void wait(unique_lock<mutex> &lock) {
    lock.unlock();
    this_thread::sleep_for(15ms);
    lock.lock();
  }
  void wait(unique_lock<mutex> &lock,
            const function<bool()> &pred) {
    while (!pred()) wait(lock);
  }
};

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

Простейшая реализация для 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();
}

Однако найти правильный период ожидания может быть сложно. Чем оно ниже, тем больше оно похоже на занятое ожидание, и, следовательно, больше тратится циклов ЦП. Чем оно выше, тем меньше процессорных циклов тратится впустую, но тем хуже скорость отклика.

Как часто в вашей реализации происходят ложные пробуждения, зависит от выбора периода ожидания.

0 голосов
/ 18 февраля 2020

Условная переменная предназначена для использования семафора , что позволяет ожидать без использования циклов ЦП. Ваша реализация многократно блокирует и разблокирует мьютекс, и без режима сна она будет потреблять 100% ресурсов ЦП.

В режиме сна фиксированная задержка при пробуждении, что также является недостатком по сравнению с семафором. Операционная система знает, кто ожидает каждую переменную условия, и поэтому она эффективна для пробуждения.

При Windows, std::condition_variable будет использовать SleepConditionVariableCS для ожидания и, как правило, использует API переменной состояния операционной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...