Почему для изменения условия условной переменной требуется владение мьютексом?C++

Программы на C++. Форум разработчиков
Anonymous
Почему для изменения условия условной переменной требуется владение мьютексом?

Сообщение Anonymous »


Рассмотрим следующий случай (это стандартное использование в cppreferences):

std::atomic условие (false); тема 1: замок // проверяем условие в последний раз перед ожиданием если (условие == true) {unlock; возвращаться; } // чтобы внести ясность, я расширяю здесь слово "подождать" { // В моем понимании разместить задачу в списке ожидания разблокировать урожай замок проверить состояние ... } тема 2: замок условие=истина notify_one разблокировать Я понимаю, что потоку 2 требуется lock и unlock, чтобы notify_one вызывался не после проверки условия, а перед отправкой задачи в список ожидания (насколько я понимаю, notify_one ничего не делает, если задача не добавлена ​​в список ожидания).

Однако я думаю, что изменение условия (condition=true в примере) не требует владения мьютексом, то есть я думаю, что это тоже должно работать:

поток 2: условие=истина замок notify_one разблокировать Потому что, насколько я понимаю, если notify_one вызывается до блокировки потока 1, то проверка условия перед ожиданием вернет true, а поток 1 вообще не будет ждать. Если notify_one вызывается после разблокировки потока 1, задача уже отправлена ​​в список ожидания, поэтому поток 1 может проснуться и проверить условие, которое уже было истинным.

Однако cppreferences говорит, что даже если общая переменная является атомарной, ее необходимо изменить, владея мьютексом. Есть ли что-то, чего мне не хватает?

По теме:

Почему функциям условных переменных pthreads требуется мьютекс?

Почему условная переменная нуждается в блокировке (и, следовательно, мьютексе)

Но мой вопрос более конкретен, чем они.

Вернуться в «C++»