2015-09-24 10 views
6

Sto provando a creare un programma multi-thread ma sto avendo uno strano problema con i vettori locali del thread. Ecco il (stripped-down per avere l'unico errore) Codice:thread_local errore di segmentazione vettoriale alla fine del programma in 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(); 
} 

Il programma compila bene e funziona per lo più bene, ma se si preme entrare ottengo un "programma ha smesso di funzionare" il messaggio. Mi sono imbattuto in gdb e ottenuto questo errore:

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

In qualche modo, c'è un errore nel distruttore del vettore. Attraversarlo con un punto di interruzione mostra che questo errore si verifica mentre il programma si chiude.

Rendere il vettore non thread locale fa funzionare il programma, ma ovviamente ho bisogno che sia thread locale. Se non interagisco con il vettore, il programma funziona correttamente.

Sto pensando che dovrò usare qualche alternativa, ma qualcuno sa come farlo funzionare? Grazie!

EDIT: Sono stupido e ho dimenticato più informazioni sul mio sistema. Sto usando Windows Vista a 64 bit. g ++ Esecuzione -v mi dà:

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) 

Il modello di thread potrebbe in realtà hanno molto a che fare con esso.

+0

come sono stati creati i tuoi thread? ti "unisci" i fili? – Bill

+0

Il codice fornito in questa domanda viene compilato ed eseguito correttamente, senza errori, con gcc 5.1.1 –

+0

Codice funziona per me su Linux GCC 5.1.1. Quale compilatore/versione stai usando? – Galik

risposta

0

Dipende dal setup; Ho compilato ed eseguito con successo il tuo programma di esempio su Windows 7 (64 bit) con MinGW a 64 bit. Forse è legato al fatto che si utilizza l'installazione MinGW a 32 bit su una piattaforma a 64 bit? Il mio g ++ -v fornisce quanto segue (stessa versione e modello di thread del tuo, arco diverso):

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)