为什么 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.5 和 MacOS: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。
#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.5 和 MacOS: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。