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.
W jaki sposób tworzone są twoje wątki? czy "dołączasz" do wątków? – Bill
Kod podany w tym pytaniu kompiluje się i działa pomyślnie, bez błędów, z gcc 5.1.1 –
Kod działa dla mnie na Linux GCC 5.1.1. Jakiego kompilatora/wersji używasz? – Galik