I understand that volatile
informs the compiler that the value may be changed, but in order to accomplish this functionality, does the compiler need to introduc
This is largely from memory, and based on pre-C++11, without threads. But
having participated in discussions on threading in the committe, I can say that
there was never an intent by the committee that volatile
could be used for
synchronization between threads. Microsoft proposed it, but the proposal
didn't carry.
The key specification of volatile
is that access to a volatile represents an
"observable behavior", just like IO. In the same way the compiler cannot
reorder or remove specific IO, it cannot reorder or remove accesses to a
volatile object (or more correctly, accesses through an lvalue expression with
volatile qualified type). The original intent of volatile was, in fact, to
support memory mapped IO. The "problem" with this, however, is that it is
implementation defined what constitutes a "volatile access". And many
compilers implement it as if the definition was "an instruction which reads or
writes to memory has been executed". Which is a legal, albeit useless
definition, if the implementation specifies it. (I've yet to find the actual
specification for any compiler.)
Arguably (and it's an argument I accept), this violates the intent of the
standard, since unless the hardware recognizes the addresses as memory mapped
IO, and inhibits any reordering, etc., you can't even use volatile for memory
mapped IO, at least on Sparc or Intel architectures. Never the less, none of
the comilers I've looked at (Sun CC, g++ and MSC) do output any fence or membar
instructions. (About the time Microsoft proposed extending the rules for
volatile
, I think some of their compilers implemented their proposal, and did
emit fence instructions for volatile accesses. I've not verified what recent
compilers do, but it wouldn't surprise me if it depended on some compiler
option. The version I checkd—I think it was VS6.0—didn't emit
fences, however.)