
Tobias Schwinger:
Most processors have linear write buffers and if 'initialized' is seen as true the object has been written, too.
The write buffer in thread 1 doesn't affect the reads in thread 2, which can still be reordered. True if by "most processors" you mean "x86", though, absent compiler optimizations. To be on the safe side one needs: if( atomic_load_acquire( &initialized ) != 0 ) { // access object } in thread 2 and // initialize object atomic_store_release( &initialized, 1 ); in thread 1. Hasn't Anthony Williams already implemented a header-only call_once? I'm not sure I see a reason to reinvent that particular wheel. Once boost::mutex is made header-only, there'd be no need for lightweight_mutex either and I'll be able to retire it as well.