Ответ 1
Представьте себе следующий сценарий:
| Thread 1 | Thread 2 |
| if(protected_by_mutex_var != desired_value) -> true | |
| | atomic_set(protected_by_mutex_var, desired_value); |
| | some_condition.notify_all(); |
| some_condition.wait(some_mutex); | |
В этой ситуации поток Thread 1 ожидает уведомления, которое никогда не появится. Поскольку утверждения, действующие на условие, не являются частью переменной read/atomic set, это представляет собой условие гонки.
Использование мьютекса эффективно делает эти действия неотделимыми (при условии, что все обращения к переменной ведут себя правильно и блокируют мьютекс.)