Семантика условного ожидания требует использования мьютекса.
Это связано с тем, что в потоке, который проверяет условие, существует потенциальное состояние гонки.Когда этот поток проверяет, стоит ли ждать, происходит следующее:
- получить эксклюзивную блокировку
- выполнить тест
либо:
a) снять блокировку и дождаться следующего сигнала
b) сохранить блокировку и продолжить
Поскольку шаг 1 получает блокировку, все это атомарно, при условии, что все остальныепартии используют мьютекс правильно.
Но как быть, когда изменяемая переменная является атомарной?
Даже если общая переменная является атомарной, ее необходимо изменить в мьютексе, чтобычтобы правильно опубликовать модификацию в ожидающей ветке.
Ну, вот почему.Если поток B появляется и модифицирует атом за пределами мьютекса, то шаги 2 и 3 больше не являются атомарными.По сути, поток B может изменить значение сразу после выполнения шага 2.Тогда поток А потенциально примет неверное решение на шаге 3.