我试图创建一个多线程程序但是线程本地向量有一个奇怪的问题。这里是(精简到只有错误)代码:
#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();
}
程序编译很好并且运行得很好,但是在我按下回车后我得到一个&#34;程序已经停止工作&#34;信息。我在gdb中运行它并得到了这个错误:
Program received signal SIGSEGV, Segmentation fault.
0x004030b0 in std::vector<int, std::allocator<int> >::~vector() ()
不知何故,向量的析构函数中存在错误。使用断点查看它会显示该错误在程序退出时发生。
使向量不是本地的线程使程序工作,但当然我需要它是线程本地的。如果我根本不与矢量进行交互,那么程序运行正常。
我以为我必须使用其他替代品,但有人知道如何让这项工作成功吗?谢谢!
编辑:我愚蠢并忘记了我的系统上的更多信息。我使用的是64位Windows Vista。运行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)
线程模型实际上可能与它有很多关系。
答案 0 :(得分:0)
它取决于设置;我已经使用64位MinGW在Windows 7(64位)上成功编译并运行了您的示例程序。也许这与您在64位平台上使用32位MinGW安装有关?我的g ++ -v给出了以下内容(与您的版本和线程模型相同,不同的arch):
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)