Однопоточный синглтон с использованием хранилища thread_local

Есть ли какие-либо предостережения относительно использования thread_local продолжительности хранения:

template <class T>
inline T &thread_local_get()
{
  thread_local T t;
  return t;
}

Потом в разных потоках (например)

thread_local_get<float>() += 1.f;

В документе cppreference говорится о продолжительности локального хранилища потока:

продолжительность хранения потока. Объект выделяется, когда поток начинается, и освобождается, когда поток заканчивается. У каждого потока есть собственный экземпляр объекта. Только объекты, объявленные thread_local, имеют этот срок хранения. thread_local может появляться вместе со static или extern для настройки связи.

Правильно ли это выделяет один thread_local экземпляр для каждого T (во время компиляции) и каждого вызывающего потока? Есть ли ситуация, которая может привести, например, к неопределенному поведению?


person Pluc    schedule 24.11.2015    source источник


Ответы (1)


Я не вижу теоретических предостережений, так как после создания экземпляра шаблон должен вести себя (с точки зрения компилятора) точно так же, как обычная функция.

Тем не менее, я бы рекомендовал проверить поддержку вашего компилятора для thread_local перед его использованием: например, в gcc была ошибка с class static thread_local members, который, похоже, все еще присутствует, по крайней мере, в последнем дистрибутиве TDM-GCC с gcc 5.1.0. Я не знаю, влияет ли эта конкретная ошибка также на статические члены функций (не должно), и, возможно, вы используете другой компилятор, но все же я предлагаю провести несколько экспериментов перед использованием этой функции.

person Alberto M    schedule 25.11.2015
comment
Я принимаю это как решение, поскольку со стандартной точки зрения кажется, что это правильный код, я даже нашел реализацию предложения iso с использованием того же точного кода (чего это стоит). Но есть смысл напомнить, что компиляторы не на 100% свободны от ошибок .. :) - person Pluc; 01.12.2015