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?
Antworten:
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.
quelle
g++-mingw-w64-x86-64
enthält zwei Dateienx86_64-w64-mingw32-g++-win32
undx86_64-w64-mingw32-g++-posix
undx86_64-w64-mingw32-g++
ist auf eine von ihnen ausgerichtet. sieheupdate-alternatives --display x86_64-w64-mingw32-g++
.--threads=win32
. Solange die fehlenden Bits nicht in GCC implementiert sind, müssen Sie GCC mit konfigurieren--threads=win32
.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 :
quelle
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.
quelle