Почему для изменения условия условной переменной требуется владение мьютексом?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 требуется мьютекс?

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

Но мой вопрос более конкретен, чем они.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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