Есть ли какие-либо предостережения от этого использования 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 (во время компиляции) и каждого вызывающего потока? Есть ли ситуации, которые могут привести, например, к неопределенному поведению?
Я не вижу теоретических предостережений, так как после создания экземпляра (ов) шаблон должен вести себя (с точки зрения компилятора) точно так же, как нормальная функция.
Тем не менее, я бы порекомендовал проверить поддержку вашего компилятора для thread_local
перед его использованием: например, gcc ошибка с классом static thread_local
члены который по-прежнему присутствует, по крайней мере, в последнем дистрибутиве TDM-GCC с gcc 5.1.0. Я не знаю, влияет ли эта конкретная ошибка также на статические члены функций (это не должно), и, возможно, вы используете другой компилятор, но все же я предлагаю провести некоторые эксперименты перед использованием этой функции.
Других решений пока нет …