
Martin Bonner:
This has been raised before. I normally write single-threaded code. Occasionally I am forced to write a worker thread to perform a particular function. That means that I need BOOST_HAS_THREADS defined. On the other hand, I /know/ that most of my singletons will only be used by the main thread, so why do I have to pay for synchronization on those singletons?
This might be a relevant objection to the specific implementation under discussion, but I just want to point out that you don't need to pay for thread-safe initialization of function-level statics, especially in a "Singleton" context. Illustration: X* X::instance() { static X* s_px = 0; if( X* px = atomic_load_relaxed( &s_px ) ) { return px; // fast path } static X s_x; // "slow" thread-safe init atomic_store_release( &s_px, &s_x ); return s_px; } A sufficiently good compiler will fold this code into "static X s_x" so you won't need to do anything. The reason this works (except on Alpha) is that the accesses through the returned pointer are data-dependent and carry implicit acquire semantics.