2015-09-24 7 views
6

Próbuję utworzyć program wielowątkowy, ale mam dziwny problem z wektorem lokalnym wątku. Oto (okrojoną mieć error tylko) Kod:Wątek segmentacji wektora wątku na końcu programu w 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(); 
} 

Program kompiluje i działa głównie w porządku, ale po naciśnięciu wprowadź dostaję „Program przestał działać” wiadomość. Uruchomiłem go w gdb i otrzymałem ten błąd:

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

W jakiś sposób wystąpił błąd w destruktorze wektora. Przechodzenie przez niego z punktem przerwania pokazuje, że ten błąd występuje, gdy program przestaje działać.

Tworzenie wektora nie wątku lokalnego powoduje, że program działa, ale oczywiście potrzebuję go jako wątku lokalnego. Jeśli w ogóle nie wchodzę w interakcję z wektorem, program działa dobrze.

Myślę, że będę musiał użyć jakiejś alternatywy, ale czy ktoś wie, jak to działa? Dzięki!

EDYCJA: Jestem głupi i zapomniałem więcej informacji o moim systemie. Używam 64-bitowego systemu Windows Vista. Uruchamianie g ++ -v daje mi:

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) 

Model gwintu może rzeczywiście mieć z tym wiele wspólnego.

+0

W jaki sposób tworzone są twoje wątki? czy "dołączasz" do wątków? – Bill

+0

Kod podany w tym pytaniu kompiluje się i działa pomyślnie, bez błędów, z gcc 5.1.1 –

+0

Kod działa dla mnie na Linux GCC 5.1.1. Jakiego kompilatora/wersji używasz? – Galik

Odpowiedz

0

Jest zależny od konfiguracji; Udało mi się skompilować i uruchomić przykładowy program na Windows 7 (64-bitowy) z 64-bitowym MinGW. Być może jest to związane z faktem, że używasz 32-bitowej instalacji MinGW na platformie 64-bitowej? Mój g ++ -v daje następujące (ta sama wersja i model gwintu co twój, inny łuk):

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) 
Powiązane problemy