Frage Mingw-W64-Themen: Posix vs Win32


Ich installiere mingw-w64 unter Windows und es gibt zwei Optionen: Win32-Threads und Posix-Threads. Ich weiß, was ist der Unterschied zwischen Win32-Threads und PThreads, aber ich verstehe nicht, was der Unterschied zwischen diesen beiden Optionen ist. Ich bezweifle, dass, wenn ich Posix-Threads wählen werde, es mich davon abhält, WinAPI-Funktionen wie CreateThread aufzurufen.

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

Ich habe das 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 erlaubt die Verwendung von std :: thread, und threads-win32 verwendet die win32-API und deaktiviert den std :: thread-Teil der Standard.

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


76
2018-06-21 19:01


Ursprung


Antworten:


GCC enthält eine Compilerlaufzeitbibliothek (libgcc), mit der unter anderem eine Low-Level-Betriebssystemabstraktion für Multithreading-bezogene Funktionen in den unterstützten Sprachen bereitgestellt wird. Das relevanteste Beispiel ist libstdc ++ C ++ 11 <thread>, <mutex>, und <future>, die keine vollständige Implementierung aufweisen, wenn GCC mit dem internen Win32-Threadingmodell erstellt wird. MinGW-w64 bietet eine winpthreads (eine Pthreads-Implementierung auf der Win32-Multithreading-API), die GCC dann verknüpfen kann, um alle ausgefallenen Features zu aktivieren.

Ich muss betonen, diese Option verbietet Ihnen nicht, einen beliebigen Code zu schreiben (es hat absolut NEIN Einfluss auf welche API Sie in Ihrem Code aufrufen können). Es spiegelt nur die Laufzeitbibliotheken von GCC (libgcc / libstdc ++ / ...) wider, die für ihre Funktionalität verwendet werden. Der von @James zitierte Vorbehalt hat nichts mit dem internen Threading-Modell von GCC zu tun, sondern mit der CRT-Implementierung von Microsoft.

Zusammenfassen:

  • posix: Aktivieren Sie C ++ 11 / C11 Multithreading-Funktionen. Macht libgcc von libwinpthreads abhängig, so dass Sie, selbst wenn Sie die Pthreads-API nicht direkt aufrufen, die winpthreads-DLL verteilen. Es ist nichts falsch daran, eine weitere DLL mit Ihrer Anwendung zu verteilen.
  • win32: Keine C ++ 11 Multithreading-Funktionen.

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


65
2018-05-22 07:00



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, sich aber dafür entscheidet, 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 Laufzeitumgebung verwenden, sollten Sie die Win32-APIs wahrscheinlich nicht direkt aufrufen. Zitat aus der MinGW FAQ:

Da MinGW die Standard-Microsoft-Laufzeitbibliothek verwendet, die mit Windows geliefert wird, sollten Sie vorsichtig sein und die richtige Funktion verwenden, um einen neuen Thread zu generieren. Insbesondere die CreateThreadFunktion wird den Stapel für die C-Laufzeitbibliothek nicht ordnungsgemäß einrichten. Du solltest benutzen _beginthreadex stattdessen, das (fast) vollständig kompatibel ist mit CreateThread.


15
2018-06-22 19:13



Beachten Sie, dass es jetzt möglich ist, einige C ++ 11 std :: thread im Win32-Threading-Modus zu verwenden. Diese Header-Only-Adapter funktionierten für mich aus der Box: https://github.com/meganz/mingw-std-threads

Aus der Revisionshistorie sieht es so aus, als ob kürzlich versucht wurde, dies zu einem Teil der mingw64-Laufzeit zu machen.


10
2017-09-19 15:32