it-swarm.com.de

mingw-w64-Threads: posix vs win32

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 WinAPI-Funktionen wie CreateThread nicht aufrufen kann, wenn ich Posix-Threads auswähle.

Anscheinend gibt diese Option an, welche Threading-API von einem Programm oder einer Bibliothek verwendet wird, aber von wem? Von GCC, libstdc ++ oder von etwas anderem?

Ich habe folgendes gefunden: Was ist der Unterschied zwischen thread_posixs und thread_win32 in gcc port of windows?

Kurz gesagt, für diese Version von mingw verwendet das Release threads-posix 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?

97
Simon

GCC wird mit einer Compiler-Laufzeitbibliothek (libgcc) ausgeliefert, mit der (unter anderem) eine Betriebssystemabstraktion auf niedriger Ebene für Multithreading-bezogene Funktionen in den unterstützten Sprachen bereitgestellt wird. 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 auf der Win32-Multithreading-API), in die GCC dann eine Verknüpfung herstellen kann, um alle ausgefallenen Funktionen zu aktivieren.

Ich muss betonen, dass diese Option es Ihnen nicht verbietet, den von Ihnen gewünschten Code zu schreiben (sie hat absolut NEIN Einfluss darauf, welche API Sie in Ihrem Code aufrufen können). Es gibt nur wieder, welche GCC-Laufzeitbibliotheken (libgcc/libstdc ++/...) für ihre Funktionalität verwendet werden. Die von @James zitierte Einschränkung hat nichts mit dem internen Threading-Modell von GCC zu tun, sondern eher mit der CRT-Implementierung von Microsoft.

Zusammenfassen:

  • posix: Aktiviert C++ 11/C11-Multithreading-Funktionen. Lässt libgcc von libwinpthreads abhängig werden, 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.

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

95
rubenvb

Teile der GCC-Laufzeit (insbesondere die Ausnahmebehandlung) hängen vom verwendeten Threading-Modell ab. Wenn Sie also die Version der Laufzeitumgebung verwenden, die mit POSIX-Threads erstellt wurde, sich aber dafür entscheiden, Threads in Ihrem eigenen Code mit den Win32-APIs zu erstellen, werden Sie wahrscheinlich irgendwann Probleme haben.

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

Da MinGW die standardmäßige Microsoft C-Laufzeitbibliothek verwendet, die mit Windows geliefert wird, sollten Sie vorsichtig sein und die richtige Funktion verwenden, um einen neuen Thread zu generieren. Insbesondere die Funktion CreateThread richtet den Stack für die C-Laufzeitbibliothek nicht korrekt ein. Du solltest benutzen _beginthreadex stattdessen, was (fast) vollständig mit CreateThread kompatibel ist.

15

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.

11
Tom 7