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