gpt4 book ai didi

c++ - 为什么 C++ 中的静态 thread_local 对象构造了两次?

转载 作者:可可西里 更新时间:2023-11-01 17:59:56 24 4
gpt4 key购买 nike

这段代码:

#include <iostream>
#include <thread>
#include <mutex>

struct Singl{
Singl(Singl const&) = delete;
Singl(Singl&&) = delete;

inline static thread_local bool alive = true;

Singl(){
std::cout << "Singl() " << std::this_thread::get_id() << std::endl;
}
~Singl(){
std::cout << "~Singl() " << std::this_thread::get_id() << std::endl;
alive = false;
}
};

static auto& singl(){
static thread_local Singl i;
return i;
}

struct URef{
~URef(){
const bool alive = singl().alive;
std::cout << alive << std::endl;
}
};


int main() {
std::thread([](){
singl();
static thread_local URef u;
}).join();

return 0;
}

具有以下输出:

Singl() 2
Singl() 2
1
~Singl() 2
~Singl() 2

我正在使用 mingw-w64 gcc7.2 POSIX 线程在 Windows 下编译和运行。

Coliru 有不同的输出: http://coliru.stacked-crooked.com/a/3da415345ea6c2ee

这是什么?我的工具链/编译器有问题,或者它应该如何?为什么我在同一个线程上有两个 thread_local 对象(或构造两次?)?

最佳答案

这可能是您的编译器或工具链出了问题。

对于 Linux 上的 clang++ 8 和 g++ 8.2(准确地说是 Devuan ASCII),线程局部变量仅构造一次。

关于c++ - 为什么 C++ 中的静态 thread_local 对象构造了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47226542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com