Это правильный способ гарантировать инициализацию 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, так что это может быть прозрачным решением.

0 ответов

Другие вопросы по тегам