2016-05-21 12 views
14

Wybrałem model Win32 threading podczas instalowania toolchaina MinGW-w64, po przeczytaniu, że zapewnia on lepszą wydajność niż odpowiednik POSIX. Nie kwalifikuję się do porównywania tego twierdzenia osobiście, ale do tego, here's a source for it.Czy MinGW-w64 obsługuje std :: thread out of the box przy korzystaniu z modelu Win32 threading?

Na początku myślałem, że ta opcja będzie miała wpływ tylko na wewnętrzne funkcjonowanie runtime GCC, natomiast nie pozwala mi z użyciem C++ 11 wątków w moim kodu, na podstawie this answer i this comment przez innych użytkowników rubenvb.
Jednak nie wydaje się, aby tak było. std::thread Obsługa wydaje się nie istnieć w tej instalacji MinGW-w64.

Wywołuję g ++ z wiersza poleceń bez opcji innych niż -std=c++11.

W tym momencie nie jestem pewien, czy:

  • rubenvb było źle, i to jest rzeczywiście konieczne zainstalowanie MinGW-W64 pod gwintu modelu POSIX, aby skompilować mój kod, który zależy od Biblioteka C++ 11 thread, lub;
  • Całkowicie źle to zrozumiałem, lub;
  • std::thread jest rzeczywiście obsługiwany w moim scenariuszu, to po prostu nie jest intuicyjne.

Wzmacniam część "out of the box" w tytule. Istnieje biblioteka o nazwie mingw-std-threads, przedstawiona w this answer. Jednak jako opcja niezależna nie ma znaczenia dla tego pytania.

Czy na dzień dzisiejszy (maj 2016 r.) Program MinGW-w64 obsługuje tylko numer std::thread po zainstalowaniu z wewnętrznym gwintowaniem Win32?

+0

instalowanie mingw-std-threads w połączeniu z, działa i trwa około 30 sekund –

+0

@ M.M ... Dzięki za sugestię, już to zrobiłem. Pytanie to dotyczy jednak głównie ciekawości/kanoniczności. Informacje wydają się różnić w zależności od różnych źródeł. –

+0

Ani moja odpowiedź, ani mój komentarz nie są błędne. Zostały napisane w czasie, w którym biblioteka wątków-wątków nie była dostępna (a przynajmniej nie zdawałem sobie z tego sprawy). GCC z wewnętrznym modelem wątków ustawionym na win32 nie obsługuje funkcji wątków C++ 11, period. Moja odpowiedź, którą łączysz, mówi dokładnie to. Mój komentarz z drugiej strony nie mówi o obsłudze wątków C++ 11. Zamiast tego zajmuje się wywoływaniem funkcji Pthreads lub Win32 związanych z wątkami z GCC zbudowanym z Win32/Posix jako wewnętrznym modelem wątków, który działa tak, jak można by oczekiwać. To są dwa bardzo różne tematy. – rubenvb

Odpowiedz

12

Aby używać MinGW-w64 z natywnymi wątkami Win32, należy również zainstalować nagłówki mingw-std-threads.

Jak opisano na tej stronie, dzieje się tak dlatego, że MinGW-w64 jest portem GCC, ale GCC nie obejmuje obsługi wątków natywnych. Zamiast tego instalacje GCC zazwyczaj implementują wątki za pośrednictwem gthreadów lub pthreadów jako część glibc. MinGW-w64 nie zawiera portu glibc. (Zamiast tego używa kombinacji środowiska wykonawczego MSVC oraz własnego kodu do wypełniania dziur).

Ponadto, jak opisano na tej stronie, najnowsze wersje MinGW-w64 zawierają port Win32 pthreads, co wyjaśnia, dlaczego wątki mogą działać "po wyjęciu z pudełka", wybierając model "pthread" z MinGW-a Instalator w64.