На этом сайте есть пара вопросов о том, возможно ли использование переменной volatile
для атомарного / многопоточного доступа: см. здесь , здесь , или здесь например.
Теперь стандартный совместимый ответ C (++), очевидно, no .
Однако в компиляторе Windows & Visual C ++ ситуациякажется не очень понятным.
Я недавно ответил и процитировал официальные документы MSDN на volatile
Microsoft Specific
Объектами, объявленными как volatile, являются (...)
- Запись в volatile-объект (volatile write) имеет семантику Release;ссылка на глобальный или статический объект ? , который происходит перед записью в энергозависимый объект в последовательности команд до того, как эта энергозависимая запись в скомпилированном двоичном файле.
- Чтение летучего объекта (volatile read) имеет семантику Acquire;ссылка на глобальный или статический объект ? , который происходит после чтения энергозависимой памяти в последовательности команд, после этого энергозависимого чтения в скомпилированном двоичном файле.
Это позволяет использовать энергозависимые объекты для блокировок и выпусков памяти в многопоточных приложениях.
[выделение мин]
Теперь, читая это, мне кажется, что переменная энергозависимости будет обрабатываться компилятором MS как std::atomic
в следующем стандарте C ++ 11.
Однако,в комментарии к моему ответу , пользователь Ханс Пассант писал "Эта статья MSDN очень неудачная, она совершенно неверна. Вы не можете реализовать блокировку с помощью volatile, недаже с версией Microsoft. (...) "
Обратите внимание: пример , приведенный в MSDN, выглядит довольно подозрительно, так как вы обычно не можете реализовать блокировку безатомный обмен .(Как указал Алекс .) Это все же оставляет вопрос без ответа.действительность другой информации, приведенной в этой статье MSDN, особенно для случаев использования, таких как здесь и здесь .)
Кроме того, есть документыдля функций Interlocked *, особенно InterlockedExchange
с, принимает переменную volatile (!?) и выполняет атомарное чтение + запись.(Обратите внимание, что у нас есть один вопрос по SO - Когда следует использовать InterlockedExchange? - не дает достоверного ответа, нужна ли эта функция для атомарного доступа только для чтения или только для записи.)
Более того, приведенные выше документы volatile
как-то ссылаются на "глобальный или статический объект", где я бы подумал, что "реальная" семантика получения / выпуска должна применяться ко всем значениям.
Вернуться к вопросу
В Windows с Visual C ++ (2005 - 2010) объявление переменной (32bit? Int?) Как volatile
допускает атомарное чтение и запись в эту переменную -- или нет?
Что для меня особенно важно, это то, что это должно сохраняться (или нет) в Windows / VC ++ независимо процессора или платформы, на которой работает программа.(То есть, имеет ли значение WinXP / 32-битная или Windows 2008R2 / 64-битная, работающая на Itanum2?)
Пожалуйста, подтвердите свой ответ проверяемой информацией, ссылками, тестовыми примерами!