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