С удивлением узнал о том, что GCC гарантирует атомарность создания статического объекта. Поэтому следующий код будет корректен в многопоточном окружении:
template <typename T>
T& singleton()
{
static T obj;
return obj;
}
T& singleton()
{
static T obj;
return obj;
}
Если по каким-то причинам такое поведение кажется возмутительным, можно воспользоваться флагом -fno-threadsafe-statics
Кстати, кто знает как обстоят дела с инициализацией статических объектов у других компиляторов?