C++程序结束时的thread_local向量分段错误

sud*_*dgy 6 c++ multithreading vector

我正在尝试制作一个多线程程序但是线程局部向量有一个奇怪的问题.这是(精简到只有错误)代码:

#include <vector>
#include <iostream>
thread_local std::vector<int> vec;
int main(){
    vec.push_back(3);
    std::cout << vec[0];
    // Make you push enter to show the error is at the end
    std::cin.ignore();
}
Run Code Online (Sandbox Code Playgroud)

该程序编译良好,运行大多数罚款,但在我按回车后,我得到一个"程序已停止工作"的消息.我在gdb中运行它并得到此错误:

Program received signal SIGSEGV, Segmentation fault.
0x004030b0 in std::vector<int, std::allocator<int> >::~vector() ()
Run Code Online (Sandbox Code Playgroud)

不知何故,向量的析构函数中存在错误.使用断点查看它会显示该错误在程序退出时发生.

使向量不是本地的线程使程序工作,但当然我需要它是线程本地的.如果我根本不与矢量交互,程序运行正常.

我想我将不得不使用一些替代方案,但有人知道一种方法来使这项工作?谢谢!

编辑:我很愚蠢,忘了更多关于我的系统的信息.我正在使用Windows Vista 64位.运行g ++ -v给了我:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=C:/MinGW/bin/../libexec/gcc/i686-w64-mingw32/5.2.0/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with [edited out because it's too big and probably not relevant]
Thread model: posix
gcc version 5.2.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)
Run Code Online (Sandbox Code Playgroud)

线程模型实际上可能与它有很大关系.

小智 -1

它取决于设置;我已经使用 64 位 MinGW 在 Windows 7(64 位)上成功编译并运行了您的示例程序。也许这与您在64位平台上使用32位MinGW安装有关?我的 g++ -v 给出以下内容(与您的版本和线程模型相同,不同的架构):

Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-w64-mingw32
Thread model: posix
gcc version 5.2.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
Run Code Online (Sandbox Code Playgroud)