I recently stumbled upon this Wikipedia article. From my experience with multi-threading I am aware of the multitude of issues caused by the program being able to switch threads
Most compilers nowadays have explicit ordering intrinsics. C++0x has memory ordering intrinsics as well.