This question made me question a practice I had been following for years.
For thread-safe initialization of function-local static const objects I protect t
Here is my take (if really you can't initialize it before threads are launched):
I've seen (and used) something like this to protect static initialization, using boost::once
#include
boost::once_flag flag;
// get thingy
const Thingy & get()
{
static Thingy thingy;
return thingy;
}
// create function
void create()
{
get();
}
void use()
{
// Ensure only one thread get to create first before all other
boost::call_once( &create, flag );
// get a constructed thingy
const Thingy & thingy = get();
// use it
thingy.etc..()
}
In my understanding, this way all threads wait on boost::call_once except one that will create the static variable. It will be created only once and then will never be called again. And then you have no lock any more.