Если интересно, что здесь происходит.1. Цикл теперь выполняется относительно локальной переменной repeat. Она отражает состояние атомарной переменной
QuitThread (нужно ли остановить consumer).
2. Ослабили барьер памяти, под которым происходит чтение атомарной переменной QuitThread. Судя по кодовой базе, её модификация и чтение всегда происходит под мьютексом StreamLock. Мьютекс сам по себе является полным барьером памяти (std::memory_order_seq_cst), следовательно, чтение и запись можно производить в режиме std::memory_order_relaxed. Если хочется, чтобы компилятор/процессор не переупорядочивал инструкции, можно производить чтение в режиме std::memory_order_acquire, а запись — в режиме std::memory_order_release.
3. Добавили предикат, который будет проверять готовность общих данных и исключать спонтанные пробуждения. Предикат внутри перечитывает значение атомарной переменной QuitThread. Согласно стандарту, предикат исполняется под блокировкой, поэтому чтение QuitThread можно производить в режиме std::memory_order_relaxed.
4. Оставили один вызов std::condition_variable::wait_for, который будет ставить consumer в ожидание, пока не готовы общие данные. Для того, чтобы избежать возможного вечного зависания, каждые 100 миллисекунд будем пробуждать consumer. Например, если кто-то забудет вызвать std::condition_variable::notify_* при выставлении QuitThread в true.
5. Если wait_for возвращает false, то это означает, что за указанное время данных не поступило. Иначе надо перепроверить, не выставил ли producer QuitThread в true и остановить выполнение цикла.
Я ничего не понял, но это правда было интересно 0.0
Комментарий недоступен