为什么静态thread_local对象在C++构造两次

Why is a static thread_local object in C++ constructed twice?

本文关键字:两次 C++ thread 静态 local 对象 为什么      更新时间:2023-10-16

此代码:

#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(确切地说是Devuan ASCII(上使用clang++ 8和g++ 8.2,线程局部变量只构造一次。