It's true that (as implied by the article) you can probably get by with just studying/programming with the C/C++ [1][2] "atomic" memory access types and letting the compiler enforce those semantics, though the reasoning behind a lot of these memory orderings is lost without understanding the motivation/arch. models behind them.
If you're interested in the C/C++ memory models there's active research into specifying them without bad behavior (thin-air reads [3]). Recent results include a semantics that makes value promises and requires a justifying execution [4] which is not totally dissimilar from those required by the official java memory model [5].
1. http://en.cppreference.com/w/cpp/atomic/atomic
2. http://en.cppreference.com/w/c/atomic
3. http://www.cl.cam.ac.uk/~pes20/cpp/notes42.html
4. https://people.mpi-sws.org/~dreyer/papers/promising/paper.pd...