2015-09-24 22 views
6

私はマルチスレッドプログラムを作成しようとしていますが、スレッドローカルベクトルには奇妙な問題があります。ここでは、コード(だけ持ってエラーに削ぎ落とした)です: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) 

スレッドモデルは、実際にはそれと関連があるかもしれません。

+0

スレッドはどのように作成されますか?スレッドに 'join'するのですか? – Bill

+0

この問題で与えられたコードは、gcc 5.1.1 –

+0

で正常にコンパイルされ、エラーなく実行されます。Linux GCC 5.1.1でコードが動作します。どのコンパイラ/バージョンを使用していますか? – Galik

答えて

0

設定に依存します。私は正常にコンパイルし、Windows 7(64ビット)で64ビットのMinGWでサンプルプログラムを実行しました。おそらく、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) 
関連する問題