是否可以推迟 thread_local 初始化?

问题描述 投票:0回答:1

如果我在外部函数的另一个线程上下文中定义了一个 thread_local 对象,是否可以在另一个线程中重新初始化该对象?

int main()
{
    thread_local string str( "hello world" );
    jthread( [&]
            {
                // re-init str for this thread if it hasn't been initialized yet
            } );
}
c++ c++11 thread-local
1个回答
0
投票

你想要做 mayer 的单例,但是用

thread_local
而不是
static
,所以每个线程都有自己的版本,你不需要在每个函数中重复它的定义。

#include <string>
#include <thread>

std::string& GetThreadString()
{
    thread_local std::string str{"hello"};
    return str;
}

int main()
{
    // init an instance in first thread
    auto& str = GetThreadString(); 
    std::thread( []
            {
                // init another instance in second thread
                auto& str2 = GetThreadString();
            } ).join();
}

如果您只需要另一个线程内的一个版本,您可以使用 lambda,但您需要非常小心您的捕获生命周期。

#include <string>
#include <thread>

int main()
{
    auto data = "hello";
    auto str_source = [&]()->auto&{
        thread_local std::string str{data};
    return str;
        };
    std::thread( [&]
            {
                auto& str = str_source();
            } ).join();
}
© www.soinside.com 2019 - 2024. All rights reserved.