I\'ve seen this sentence:
the general rule is, if you have variables of primitive type that must be shared among multiple threads, declare those
I remember when that article was published and I remember the endless discussions that then followed on comp.lang.c++.moderated.
IIRC, Andrei hijacks the volatile
keyword to use it to discriminate between different function overloads. (See this article by Scott Meyers for another such an idea.) What he does is brilliant, in that it allows the compiler to catch you if you mess up protected and unprotected access to objects (very much like the compiler catches you should you try to modify a constant). But besides the fact that it helps you, it has nothing to do with actually protecting concurrent access to objects.
The problem is only that 90% of the people have one glance at the article and all they see is volatile
and "threads" in the same article. Depending on their knowledge, they then either draw the wrong conclusion that volatile
is good for threads (you seem to have done so) or they yell at him for leading others to draw the wrong conclusions.
Very few people seem to be able to actually read the article thoroughly and understand what he really does.