volatile запрещает оптимизатору считать значение неизменным — нужно для MMIO, флагов ISR и similarly externally modified данных.
Разбор
- Не даёт атомарности и не заменяет mutex.
volatile int* vs int* volatile — разный смысл.
- Не «лечит» гонки.
- Каждое чтение/запись — побочный эффект.
Итог
Volatile — про оптимизатор, не про синхронизацию.