Это правильный способ гарантировать инициализацию thread_local?
Рассмотрим приведенный ниже тестовый пример:
#include <iostream>
#include <thread>
thread_local struct Bar
{
Bar() { std::cout << '*' << std::endl; }
~Bar() { std::cout << '~' << std::endl; }
} bar;
struct Foo
{
void baz()
{
(void)&bar;
}
};
int main()
{
Foo f;
f.baz();
std::thread t(&Foo::baz, &f);
t.join();
}
На Coliru это работает так, как я намереваюсь, с, казалось бы, бесполезным утверждением (void)&bar
по-видимому, считая "использовать" и гарантируя, что bar
построен в любом потоке, который вызывает baz()
,
Это гарантировано, или я должен сделать что-то большее?
Я надеюсь использовать класс как Bar
обернуть некоторую инициализацию для каждого потока, требуемую библиотекой C, которую я собираюсь использовать, с минимальным количеством шаблонов. baz()
это уже функция, которую любой поток будет вызывать для работы с библиотекой C, так что это может быть прозрачным решением.