Этот вопрос заставили меня усомниться в практике, которой я следовал годами.
Для потокобезопасной инициализации локальных статических константных объектов, я защищаю фактическую конструкцию объекта, но не инициализацию локальной ссылки на функцию em> имея в виду именно это. Что-то вроде этого:
namespace {
const some_type& create_const_thingy()
{
lock my_lock(some_mutex);
static const some_type the_const_thingy;
return the_const_thingy;
}
}
void use_const_thingy()
{
static const some_type& the_const_thingy = create_const_thingy();
// use the_const_thingy
}
Идея в том, что блокировка требует времени, и если ссылка будет перезаписана несколькими потоками, это не имеет значения.
Мне было бы интересно, если это
- достаточно безопасно на практике?
- безопасно в соответствии с Правилами? (Я знаю, текущий стандарт даже не знает, что такое «параллелизм», но как насчет того, чтобы попирать уже инициализированную ссылку? И есть ли в других стандартах, таких как POSIX, что-то связанное с этим?)
Причина, по которой я хочу это знать, заключается в том, что я хочу знать, могу ли я оставить код как есть или мне нужно вернуться и исправить это.
Для пытливых умов:
Многие из таких локальных статических константных объектов, которые я использовал, представляют собой карты, которые инициализируются из константных массивов при первом использовании и используются для поиска. Например, у меня есть несколько анализаторов XML, в которых строки имен тегов сопоставляются со значениями enum
, так что позже я смогу switch
использовать enum
значения тегов.
Поскольку я получил несколько ответов о том, что делать вместо этого, но не получил ответа на мои актуальные вопросы (см. 1. и 2. выше), я начну вознаграждение за это. Еще раз:
Меня не интересует, что я могу сделать вместо, я действительно хочу знать об этом.