如果我在外部函数的另一个线程上下文中定义了一个 thread_local 对象,是否可以在另一个线程中重新初始化该对象?
int main()
{
thread_local string str( "hello world" );
jthread( [&]
{
// re-init str for this thread if it hasn't been initialized yet
} );
}
你想要做 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();
}