2013-03-30 25 views
11

Tak więc próbuję uzyskać następujący kod do kompilacji i uruchamiania w systemie Windows przy użyciu kompilatora MinGW.MinGW i std :: thread

#include <iostream> 
#include <thread> 

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

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

Mam kompilacji za pomocą następującego polecenia:

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

Teraz problem jest wersja MinGW trzeba wykorzystać i próbowałem o wszystkie wersje znam.

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

numer 1 nie działa, ponieważ GCC apparently only supports pthread stuff wewnętrznie.

Numer 2 skompilować i to, że zasadniczo nawet wyjść test (patrz ostatni wiersz wyjścia), ale też wywala się z błędem:

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 

numer 3 i 4 ponownie nie kompiluje, ale don „wyjście t test i zamiast natychmiast zawiesza, ale z wyjściem bardziej opisowy:

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 przyniósł mi oczywiście do GCC bug tracker oraz niektórych innych stanowisk, które zalecane, aby użyć -pthread, który w ogóle nie pomaga.

Próbowałem również ręcznie linkowania przeciwko winpthread i pthread, ale to też nic nie robi.

Jest też żadnej różnicy pomiędzy -std=c++11 i -std=gnu++11 ...

Jestem naprawdę stracił już teraz, a nie wiem, czy jest to w ogóle możliwe, aby uzyskać wersji MinGW, który obsługuje std::thread, ale może ja właśnie wychodzę z niektórych flag kompilatora. Mam nadzieję, że ktoś tam może mi pomóc!

+0

Godziny spędzone na znalezienie rozwiązania, w końcu punkt 2 działał! Dzięki! – Massimo

Odpowiedz

10

Zapomniałeś dołączyć swój wątek:

t.join(); 
+2

Okej, myślę, że teraz się zabiję ... Ale dlaczego musi zwrócić tak tajemniczy błąd? Nadal nie działa ze wszystkimi wersjami, ale przynajmniej z jednym. Dzięki! – Lukas

+3

Zniszczenie łączonego wątku powoduje zgłoszenie wyjątku. Ponieważ nie wychwycisz wyjątku, program się kończy. –

3

FYI, nie jest już natywna implementacja win32 std :: wątek i synchronizacji prymitywów. Jest to biblioteka tylko nagłówkowa i działa na dowolnej wersji MinGW zgodnej z C++ 11. https://github.com/meganz/mingw-std-threads

+0

To nie jest odpowiedź na już rozwiązany problem, dlatego komentarz byłby lepiej dopasowany. Dziękujemy za udostępnienie! – Lukas

Powiązane problemy