2013-03-30 17 views
11

Quindi ho cercato di ottenere il seguente codice per compilare ed eseguire su Windows utilizzando un compilatore MinGW.MinGW e std :: thread

#include <iostream> 
#include <thread> 

void test() 
{ 
    std::cout << "test" << std::endl; 
} 

int main() 
{ 
    std::thread t(test); 
} 

Sto compilando con il seguente comando:

g++ -std=c++11 test.cpp -o test.exe 

Ora il problema è la versione di MinGW si dovrebbe usare e ho provato su tutte le versioni che conosco.

  1. MinGW-costruisce: thread-win32
  2. MinGW-build: thread-posix
  3. MinGW-W64: stdthread experimental rubenvb
  4. MinGW-W64: stdthread experimental rubenvb 4.7

numero 1 non funziona, dal momento che GCC apparently only supports roba pthread internamente.

Numero 2 si compila ed essenzialmente anche emette test (vedere l'ultima riga dell'output), ma si blocca anche con l'errore:

terminate called without an active exception 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 
test 

numero 3 e 4 nuovamente do compilare, ma don 't uscita test e invece immediatamente si blocca, ma con un output più descrittivo:

terminate called after throwing an instance of 'std::system_error' 
    what(): Enable multithreading to use std::thread: Operation not permitted 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

Google mi ha portato, naturalmente, per i GCC bug tracker e alcuni altri posti, che ha suggerito di utilizzare -pthread, che non aiuta affatto

Ho anche provato il collegamento manuale con winpthread e pthread, ma anche questo non fa nulla.

C'è anche alcuna differenza tra -std=c++11 e -std=gnu++11 ...

Sono davvero perso in questo momento e non so, se è a tutto il possibile per ottenere una versione MinGW, che supporta std::thread, ma forse sto solo guardando alcune bandiere del compilatore. Spero che qualcuno là fuori possa aiutarmi!

+0

Ore trascorse per trovare una soluzione, finalmente il punto 2 ha funzionato! Grazie! – Massimo

risposta

10

Hai dimenticato di entrare nella tua discussione:

t.join(); 
+2

Okay, penso che mi ucciderò ora ... Ma perché deve restituire un errore così criptico? Non funziona ancora con tutte le versioni, ma almeno con una. Grazie! – Lukas

+3

Se si distrugge un thread collegabile, viene generata un'eccezione. Poiché non stai rilevando l'eccezione, il programma termina. –

3

FYI, c'è già un'implementazione nativa di Win32 std :: filo e sincronizzazione primitive. È una libreria di sola intestazione e funziona su qualsiasi versione compatibile con C++ 11 di MinGW. https://github.com/meganz/mingw-std-threads

+0

Non è davvero una risposta al problema già risolto, quindi un commento sarebbe stato più adatto. Grazie per la condivisione però! – Lukas

Problemi correlati