Windows下g++9.2.0中thread_local unordered_map程序崩溃求助
问题原因与解决方案
核心原因
这是MinGW-w64版本的GCC 9.x系列在Windows平台上的已知线程局部存储(TLS)析构bug。当程序主线程退出时,thread_local修饰的std::unordered_map会触发析构,但此时C++运行时的部分内部全局结构已经被提前释放,导致容器析构过程中出现非法内存访问(对应错误码0xC0000005,即你看到的退出码-1073741819)。Unix-like系统的TLS析构调度逻辑与Windows不同,因此未触发该问题。
解决方案
升级GCC版本
该bug在GCC 10及以后的版本中已被修复,直接升级到GCC 10+即可彻底解决问题。临时绕过方案(无法升级时)
通过动态分配对象的方式避免thread_local容器的自动析构冲突:#include <iostream> #include <unordered_map> #include <memory> thread_local std::unique_ptr<std::unordered_map<uint64_t, uint64_t>> repetition_table = std::make_unique<std::unordered_map<uint64_t, uint64_t>>(); int main(int argc, char *argv[]) { repetition_table->insert({0ULL, 0ULL}); std::cout << "Hi\n"; return 0; }或者手动控制对象生命周期,在程序退出前显式释放资源:
#include <iostream> #include <unordered_map> thread_local std::unordered_map<uint64_t, uint64_t>* repetition_table = new std::unordered_map<uint64_t, uint64_t>(); int main(int argc, char *argv[]) { repetition_table->insert({0ULL, 0ULL}); std::cout << "Hi\n"; // 手动释放以规避自动析构时的冲突 delete repetition_table; repetition_table = nullptr; return 0; }
内容的提问来源于stack exchange,提问作者Alan Tao
相关产品推荐
相关产品推荐

