mingw-w64 threads: posix vs win32

127

Ich installiere mingw-w64 unter Windows und es gibt zwei Optionen: Win32-Threads und Posix-Threads. Ich weiß, was der Unterschied zwischen Win32-Threads und Pthreads ist, aber ich verstehe nicht, was der Unterschied zwischen diesen beiden Optionen ist. Ich bezweifle, dass ich bei der Auswahl von Posix-Threads keine WinAPI-Funktionen wie CreateThread aufrufen kann.

Es scheint, dass diese Option angibt, welche Threading-API von einem Programm oder einer Bibliothek verwendet wird, aber von was? Von GCC, libstdc ++ oder von etwas anderem?

Ich habe folgendes gefunden: Was ist der Unterschied zwischen thread_posixs und thread_win32 im gcc-Port von Windows?

Kurz gesagt, für diese Version von mingw verwendet die threads-posix-Version die posix-API und ermöglicht die Verwendung von std :: thread, und threads-win32 verwendet die win32-API und deaktiviert den std :: thread-Teil von Standard.

Ok, wenn ich win32-Threads auswähle, ist std :: thread nicht verfügbar, aber win32-Threads werden weiterhin verwendet. Aber von was benutzt?

Simon
quelle
Wird von Anwendungen verwendet, die mit diesem gcc erstellt wurden.
devnull
@devnull, wird dies nicht durch die API bestimmt, die ich verwenden werde? Wenn ich die pthreads-Version von MinGW auswähle, was hindert mich dann daran, WinAPI für Threads zu verwenden?
Simon
gcc wird Sie verhindern, oder besser gesagt: instabil werden
jiggunjer

Antworten:

122

GCC wird mit einer Compiler-Laufzeitbibliothek (libgcc) geliefert, mit der es (unter anderem) eine einfache Betriebssystemabstraktion für Multithreading-bezogene Funktionen in den unterstützten Sprachen bereitstellt. Das relevanteste Beispiel ist libstdc ++ 's C ++ 11 <thread>, <mutex>und <future>, die keine vollständige Implementierung haben, wenn GCC mit seinem internen Win32-Threading-Modell erstellt wird. MinGW-w64 bietet Winpthreads (eine Pthreads-Implementierung über der Win32-Multithreading-API), die GCC dann verknüpfen kann, um alle ausgefallenen Funktionen zu aktivieren.

Ich muss diese Option betonen verbietet nicht , dass Sie keinen Code zu schreiben , Sie wollen (es hat absolut NO beeinflussen , was API Sie in Ihrem Code aufrufen können). Es spiegelt nur wider, was die Laufzeitbibliotheken von GCC (libgcc / libstdc ++ / ...) für ihre Funktionalität verwenden. Die von @James zitierte Einschränkung hat nichts mit dem internen Threading-Modell von GCC zu tun, sondern mit der CRT-Implementierung von Microsoft.

Zusammenfassen:

  • posix: Aktivieren Sie die C ++ 11 / C11-Multithreading-Funktionen. Lässt libgcc von libwinpthreads abhängen, sodass Sie die winpthreads-DLL auch dann verteilen, wenn Sie die pthreads-API nicht direkt aufrufen. Es ist nichts Falsches daran, eine weitere DLL mit Ihrer Anwendung zu verteilen.
  • win32: Keine C ++ 11-Multithreading-Funktionen.

Sie haben auch keinen Einfluss auf Benutzercode, der Win32-APIs oder pthreads-APIs aufruft. Sie können immer beide verwenden.

rubenvb
quelle
7
Sie können gcc Runtime und Winpthreads jederzeit statisch verknüpfen, sodass keine DLL mehr enthalten sein muss.
Alexander Shishenko
3
Es hat eine Weile gedauert, bis ich die entsprechende Option unter Linux gefunden habe, falls es jemand anderem hilft: Das Paket g++-mingw-w64-x86-64enthält zwei Dateien x86_64-w64-mingw32-g++-win32und x86_64-w64-mingw32-g++-posixund x86_64-w64-mingw32-g++ist auf eine von ihnen ausgerichtet. siehe update-alternatives --display x86_64-w64-mingw32-g++.
Stewbasic
Hmm, Sie sagen "... die keine vollständige Implementierung haben, wenn GCC mit seinem internen Win32-Threading-Modell erstellt wird ... MinGW-w64 bietet Winpthreads (eine Pthreads-Implementierung zusätzlich zur Win32-Multithreading-API), die GCC kann Dann verlinken Sie sich, um alle ausgefallenen Funktionen zu aktivieren. " Wenn ich also das Win32-Modell auswähle, kann GCC trotzdem alle Funktionen aktivieren, da Winpthreads verwendet werden. In der folgenden Aufzählung schreiben Sie jedoch "win32: Keine C ++ 11-Multithreading-Funktionen". Ich verstehe nicht. Bedeutet "Welcher GCC kann dann eine Verknüpfung zu ... herstellen", dass er, wenn ich win32 nicht auswähle, dann ... auswählen kann?
Johannes Schaub - litb
@ JohannesSchaub-litb Nun, nein. Die Konfigurationsmagie von GCC koppelt die Auswahl des internen Thread-Modells mit den aktivierten Funktionen von libstdc ++, da letzterer auf dem internen "gthread" -Wrapper von GCC basiert (der nur eine dünne posixartige Thread-Abstraktion ist. Grundlegende Elemente für C ++ 11-Funktionen fehlen in dieser Ebene, wenn Sie verwenden --threads=win32. Solange die fehlenden Bits nicht in GCC implementiert sind, müssen Sie GCC mit konfigurieren --threads=win32.
rubenvb
Kann ich die vorkompilierten mingw-Bibliotheken von qt, die -win32 verwenden, mit anderen Bibliotheken verwenden, die -posix verwenden, und beide Bibliotheken im selben Programm verwenden?
Johannes Schaub - litb
16

Teile der GCC-Laufzeit (insbesondere die Ausnahmebehandlung) hängen vom verwendeten Threading-Modell ab. Wenn Sie also die Version der Laufzeit verwenden, die mit POSIX-Threads erstellt wurde, aber mit den Win32-APIs Threads in Ihrem eigenen Code erstellen möchten, treten wahrscheinlich irgendwann Probleme auf.

Selbst wenn Sie die Win32-Threading-Version der Laufzeit verwenden, sollten Sie die Win32-APIs wahrscheinlich nicht direkt aufrufen. Zitat aus den MinGW FAQ :

Da MinGW die mit Windows gelieferte Standard-Microsoft C-Laufzeitbibliothek verwendet, sollten Sie vorsichtig sein und die richtige Funktion verwenden, um einen neuen Thread zu generieren. Insbesondere CreateThreadrichtet die Funktion den Stapel für die C-Laufzeitbibliothek nicht korrekt ein. Sie sollten _beginthreadexstattdessen verwenden, was (fast) vollständig kompatibel ist mit CreateThread.

James Holderness
quelle
7
Was ist in diesem Fall mit den Threading-Bibliotheken von Drittanbietern wie Boost oder Qt? Gibt es eine Möglichkeit, diese Bibliotheken mit mingw64 zu verwenden, ohne die zugrunde liegende Threading-Bibliothek für diese herausfinden zu müssen? Was würde passieren, wenn ich mich willkürlich für die Verwendung von boost :: threads mit der posix-Variante von mingw entscheide?
Tantuni
1
@ user460153 einige Infos qt-project.org/wiki/…
Alex V.
10
Diese Antwort ist falsch. Die GCC-Laufzeit hat keinerlei Einfluss auf die Win32-APIs.
Rubenvb
Lesen Sie den verknüpften FAQ-Eintrag. Diese Antwort ist richtig.
Daira Hopwood
13

Beachten Sie, dass es jetzt möglich ist, einen Teil von C ++ 11 std :: thread im Win32-Threading-Modus zu verwenden. Diese Nur-Header-Adapter haben für mich sofort funktioniert: https://github.com/meganz/mingw-std-threads

Aus dem Revisionsverlauf geht hervor, dass kürzlich versucht wurde, dies zu einem Teil der mingw64-Laufzeit zu machen.

Tom 7
quelle