为什么 thread_local 在不同的编译器或不同的平台有不同的结果?

Why thread_local in different compiler or different platform has the different outcome?

#include <iostream>
#include <unordered_map>
#include <vector>
#include <thread>
using namespace std;

// not POD
struct A {
    std::unordered_map<int, int> m_test;
};
struct B{
    thread_local static A a;
};

thread_local A B::a = A();

B b;

void func(){
    b.a.m_test[0]++;
}
int main() {
    
    vector<thread> Threads;
    for (int i = 0; i < 10; i++) {
        Threads.push_back(thread(func));
    }
    for (int i = 0; i < 10; i++) {
        Threads[i].join();
    }
    return 0;
}

代码片段如上所示。 我在 Linux: gcc 4.8.5MacOS:clang13.1.6 中构建了相同的代码,结果是不同的。在 Linux 中,发生错误 17703 Floating point exception(core dumped),但在 MacOS 中没有发生错误。


我知道thread_local可以在c++11之后的POD类型中使用,但是这里我在struct中使用unordered_map,内部内存在堆中,而不是在静态或全局中储藏区域。所以我想知道这是否是因为不同的编译器如何实现 C++ 标准? 我该如何解决 linux 平台上的这个运行时错误?

根据在编译器资源管理器上的测试,这似乎是 2019 年针对版本 9+、8.4+ 和 7.5+ 修复的 GCC 错误。该代码应该可以正常工作。没毛病。

大概是this bug.

我建议您安装并使用更高 up-to-date 版本的 GCC。