2012-10-18 13 views
11

Sto solo provando alcune delle nuove funzionalità di C++ 11 con GCC 4.7.2, anche se quando vado a eseguire un errore di seg si verifica.C++ 11 Errore sego asincrono

$ ./a.out 
Message from main. 
terminate called after throwing an instance of 'std::system_error' 
    what(): Unknown error -1 
Aborted (core dumped) 

ho compilato con le caratteristiche 'beta' di GCC, per quanto riguarda il C++ 0x con:

g++ -std=c++11 c11.cpp 

Il codice:

#include <future> 
#include <iostream> 

void called_from_async() { 
    std::cout << "Async call" << std::endl; 
} 

int main() { 
    //called_from_async launched in a separate thread if possible 
    std::future<void> result(std::async(called_from_async)); 

    std::cout << "Message from main." << std::endl; 

    //ensure that called_from_async is launched synchronously 
    //if it wasn't already launched 
    result.get(); 

    return 0; 
} 

risposta

22

Credo che questo accade perché si ho dimenticato di collegarmi alla libreria dei thread POSIX. Basta aggiungere -pthread o -lpthread alle bandiere g++ e il problema dovrebbe andare via.

Se si è interessati ai dettagli, ciò accade perché il runtime di C++ 11 risolve i simboli da pthread in fase di esecuzione solo se si utilizzano tali funzionalità. Quindi, se ti sei dimenticato di collegare, il runtime non sarà in grado di risolvere quei simboli, trattare il tuo ambiente come se non supportasse i thread e generare un'eccezione (che tu non catturi e interrompa la tua applicazione).

+0

+1. Grazie mille! – TheBlueCat

+2

FWIW, l'aggiunta di -lpthread non ha funzionato, ma -pthread ha funzionato. –