Как я понимаю, volatile
-qualified value означает, что мы должны перейти к адресу и принять самое новое значение независимо от того, когда мы к нему обращаемся.
Почему волатильность делает неопределенное поведение
Сейчас я читаю книгу Эффективное Современный C++ и я не понимаю, почему volatile
делает UB здесь:
volatile int vi(0); // initialize vi to 0
vi = 10; // set vi to 10
std::cout << vi; // read vi's value
++vi; // increment vi to 11
vi--; // decrement vi to 10
Во время выполнения этого кода, если другие потоки читают значение vi, они могут видеть что угодно (например, -12, 68, 4090727-ничего!). Такой код имел бы неопределенное поведение, потому что эти операторы изменяют vi, поэтому, если другие потоки одновременно читают vi, есть одновременно читатели и писатели с памятью, которые не являются std :: atomic и не защищены мьютексом, и это определение гонка данных.
На мой взгляд, если другие потоки могут видеть 0, 10 или 11, я могу понять, но почему эта книга говорит, что «они могут увидеть что-нибудь»?
Неустойчивое целое число может быть, например, регистр HW, модифицированный исполнительным механизмом или другим внешним HW. Таким образом, значение может быть любым, на которое устанавливает внешний объект. –
несинхронизированный доступ => неопределенное поведение => все может случиться. volatile - не примитив синхронизации. – Mat
'volatile' не имеет отношения к потоку. Используйте синхронизацию 'atomic' или' mutex'. – Jarod42