(software.intel.com link worked yesterday, and failed today, so was not reread before writing this comment.  I think it has comments about what I am saying here.  The other two are not as relevant.)  Unless I made a mistake, no critical changes are ever made to a variable with volatile access without proper synchronization methods.  My intended usage of volatile is two fold.  First I like to use it to highlight variables to the next programmer that are referenced between threads independent of the the entire class / struct.  I may or may not have proper mutex or atomic synchronization on the variable depending upon its criticality.  Second I use volatile in hopes of limiting unexpected compiler optimizations that will change the code logic.  I am hinting to the compiler that the value should be reread.  The later is important if my intention is to reference the value of a variable that may be changing in another thread ... and make the reference without going through the expense of atomics / mutexes.