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