Чтение текста для std::condition_variable
Я сталкивался с этим предложением:
Даже если общая переменная является атомарной, ее необходимо изменить в мьютексе, чтобы правильно опубликовать изменение в ожидающем потоке.
У меня вопрос такой:
Какая польза от атомики, если не для «кода без блокировки для работы с POD»?
ОБНОВИТЬ
Похоже, что мой вопрос не совсем понятен 🙁
«Общая переменная» в цитируемом тексте отличается от «условной переменной». Смотрите эту цитату с той же страницы:
… до тех пор, пока другой поток не изменит общую переменную (условие) и не сообщит переменную condition_variable
Пожалуйста, не отвечайтепочему нам нужно использовать мьютекс с условными переменными» или же «как работает условное ожидание«но предоставьте информацию о том, как использование мьютекса« правильно публикует »модификацию атома в ожидающем потоке, т.е. ++counter;
(не тест как if(counter == 0)
) нужно было бы сделать под мьютексом?
Семантика условного ожидания требует использования мьютекса.
Это связано с тем, что в потоке, который тестирует условие, существует потенциальное состояние гонки. Когда этот поток проверяет, стоит ли ждать, происходит следующее:
или:
а) снять блокировку и дождаться следующего сигнала
б) сохранить замок и продолжить
Поскольку шаг 1 получает блокировку, все это атомарно, если все остальные стороны правильно используют мьютекс.
Но как быть, когда изменяемая переменная является атомарной?
Даже если общая переменная является атомарной, ее необходимо изменить в мьютексе, чтобы правильно опубликовать изменение в ожидающем потоке.
Ну, вот почему. Если поток B появляется и модифицирует атом за пределами мьютекса, то шаги 2 и 3 больше не являются атомарными. По сути, поток B может изменить значение сразу после выполнения шага 2. Тогда поток А потенциально примет неверное решение на шаге 3.
зачем использовать std :: atomic, если [условная переменная] все еще требует мьютекс для правильной работы
Нет причин использовать атомную переменную условия.
Какая польза от атомики
Даже если атомы не полезны для условных переменных, они могут быть полезны для других случаев использования. Типичным примером использования атомарного режима является реализация очереди без блокировки.