Instaluję mingw-w64 w systemie Windows i są dwie opcje: wątki win32 i wątki posix. Wiem, jaka jest różnica między wątkami win32 i pthreads, ale nie rozumiem, jaka jest różnica między tymi dwiema opcjami. Wątpię, czy jeśli wybiorę wątki posix, uniemożliwi to wywoływanie funkcji WinAPI, takich jak CreateThread.
Wygląda na to, że ta opcja określa, które API wątków będzie używane przez jakiś program lub bibliotekę, ale przez co? Przez GCC, libstdc ++ czy coś innego?
Znalazłem to: Jaka jest różnica między thread_posixs i thread_win32 w porcie gcc w systemie Windows?
W skrócie, dla tej wersji mingw, wydanie thread-posix będzie używać API posix i pozwoli na użycie std :: thread, a wątki-win32 użyją API win32 i wyłączy część std :: thread standard.
Ok, jeśli wybiorę wątki win32, to std :: thread będzie niedostępne, ale wątki win32 będą nadal używane. Ale przez co?
Odpowiedzi:
GCC jest dostarczane z biblioteką wykonawczą kompilatora (libgcc), której używa (między innymi) do dostarczania niskopoziomowej abstrakcji systemu operacyjnego dla funkcji związanych z wielowątkowością w obsługiwanych językach. Najodpowiedniejszym przykładem jest libstdc ++ 's C ++ 11
<thread>
,<mutex>
oraz<future>
, które nie posiadają pełną implementację gdy GCC jest zbudowany z gwintem wewnętrznym modelu Win32. MinGW-w64 zapewnia winpthreads (implementację pthreads będącą uzupełnieniem interfejsu API wielowątkowości Win32), do którego GCC może się następnie łączyć, aby włączyć wszystkie wymyślne funkcje.Muszę podkreślić, tej opcji nie zabrania wam pisać żadnego kodu, który chcesz (nie ma absolutnie NIE wpływają na to, co można nazwać API w kodzie). Odzwierciedla tylko to, czego biblioteki wykonawcze GCC (libgcc / libstdc ++ / ...) używają ze względu na ich funkcjonalność. Zastrzeżenie przytoczone przez @James nie ma nic wspólnego z wewnętrznym modelem wątków GCC, ale raczej z implementacją CRT firmy Microsoft.
Podsumowując:
posix
: włącz funkcje wielowątkowości C ++ 11 / C11. Sprawia, że libgcc zależy od libwinpthreads, więc nawet jeśli nie wywołasz bezpośrednio API pthreads, będziesz dystrybuować bibliotekę DLL winpthreads. Nie ma nic złego w rozpowszechnianiu jeszcze jednej biblioteki DLL z aplikacją.win32
: Brak funkcji wielowątkowości w C ++ 11.Nie mają również wpływu na kod użytkownika wywołujący interfejsy API Win32 lub API pthreads. Zawsze możesz użyć obu.
źródło
g++-mingw-w64-x86-64
zawiera dwa plikix86_64-w64-mingw32-g++-win32
ix86_64-w64-mingw32-g++-posix
, ix86_64-w64-mingw32-g++
jest aliasem do jednego z nich; zobaczupdate-alternatives --display x86_64-w64-mingw32-g++
.--threads=win32
. Tak długo, jak brakujące bity nie są zaimplementowane w GCC, musisz skonfigurować GCC z--threads=win32
.Części środowiska wykonawczego GCC (w szczególności obsługa wyjątków) zależą od używanego modelu wątków. Tak więc, jeśli używasz wersji środowiska wykonawczego, które zostało zbudowane z wątkami POSIX, ale zdecydujesz się utworzyć wątki we własnym kodzie za pomocą interfejsów API Win32, prawdopodobnie w pewnym momencie wystąpią problemy.
Nawet jeśli używasz wersji środowiska wykonawczego z wątkami Win32, prawdopodobnie nie powinieneś bezpośrednio wywoływać interfejsów API Win32. Cytowanie z FAQ MinGW :
źródło
Zauważ, że jest teraz możliwe użycie części C ++ 11 std :: thread w trybie wątków win32. Te adaptery tylko do nagłówka działały dla mnie od razu po wyjęciu z pudełka: https://github.com/meganz/mingw-std-threads
Z historii wersji wygląda na to, że ostatnio podjęto próbę uczynienia tego częścią środowiska wykonawczego mingw64.
źródło