Являются ли изменчивые операции чтения и записи атомарными в Windows + VisualC?

На этом сайте есть несколько вопросов, касающихся возможности использования переменной 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?)

Подтвердите свой ответ проверяемой информацией, ссылками, тестовыми примерами!

11
задан Community 23 May 2017 в 11:48
поделиться