Для каждого потока синглтоноподобно с использованием хранилища 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 (во время компиляции) и каждого вызывающего потока? Есть ли ситуации, которые могут привести, например, к неопределенному поведению?

2

Решение

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]