Почему для изменения условия условной переменной требуется владение мьютексом? ⇐ C++
Почему для изменения условия условной переменной требуется владение мьютексом?
Рассмотрим следующий случай (это стандартное использование в 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 требуется мьютекс?
Почему условная переменная нуждается в блокировке (и, следовательно, мьютексе)
Но мой вопрос более конкретен, чем они.
Рассмотрим следующий случай (это стандартное использование в 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 требуется мьютекс?
Почему условная переменная нуждается в блокировке (и, следовательно, мьютексе)
Но мой вопрос более конкретен, чем они.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение