私はマルチスレッドプログラムを作成しようとしていますが、スレッドローカルベクトルには奇妙な問題があります。ここでは、コード(だけ持ってエラーに削ぎ落とした)です:thread_local C++のプログラム終了時のベクトルセグメンテーションエラー
#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();
}
プログラムは罰金コンパイルし、主に細かい動作しますが、私はEnterキーを押した後、私はメッセージを「プログラムが動作を停止しました」を得ます。私はgdbで実行し、このエラーが発生しました:
Program received signal SIGSEGV, Segmentation fault.
0x004030b0 in std::vector<int, std::allocator<int> >::~vector()()
どういうわけか、ベクトルのデストラクタにエラーがあります。ブレークポイントでそれを調べると、プログラムが終了するとこのエラーが発生することがわかります。
ベクトルをローカルスレッドにしないと、プログラムは動作しますが、スレッドローカルにする必要があります。私がベクトルと全くやり取りしなければ、プログラムは正常に動作します。
私はいくつかの代替手段を使わなければならないと思っていますが、誰もがこの作業を行う方法を知っていますか?ありがとう!
編集:私は愚かで、私のシステムについての情報を忘れてしまった。私は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)
スレッドモデルは、実際にはそれと関連があるかもしれません。
スレッドはどのように作成されますか?スレッドに 'join'するのですか? – Bill
この問題で与えられたコードは、gcc 5.1.1 –
で正常にコンパイルされ、エラーなく実行されます。Linux GCC 5.1.1でコードが動作します。どのコンパイラ/バージョンを使用していますか? – Galik