The only thing I took away from that discussion was that you don't need volatile because you can always make a call to a "dummy function" which forces the compiler to synchronize the memory location. While true, it seems like a dorky hack.
Also, it seems this approach would not work with a non-global variable, for instance a variable accessed through a pointer which is shared between threads. The pointer itself might be synchronized, but the value it points to won't be, unless it is declared volatile.
You could write thread safe code without volatile, just as you could build a house with no nails, but it's not inherently a better or worse way of doing things. Just be aware that volatile makes guarantees about the reads and writes on specific variables, not the interactions between those variables. You still have to understand barriers, etc.