J'installe mingw-w64 sur Windows et il y a deux options: les threads win32 et les threads posix. Je sais quelle est la différence entre les threads win32 et les pthreads, mais je ne comprends pas quelle est la différence entre ces deux options. Je doute que si je choisis les threads posix, cela m'empêchera d'appeler des fonctions WinAPI comme CreateThread.
Il semble que cette option spécifie quelle API de threading sera utilisée par un programme ou une bibliothèque, mais par quoi? Par GCC, libstdc ++ ou par autre chose?
J'ai trouvé ceci: Quelle est la différence entre thread_posixs et thread_win32 dans le port gcc de Windows?
En bref, pour cette version de mingw, la version threads-posix utilisera l'API posix et autorisera l'utilisation de std :: thread, et threads-win32 utilisera l'API win32, et désactivera la partie std :: thread du la norme.
Ok, si je sélectionne les threads win32, std :: thread ne sera pas disponible mais les threads win32 seront toujours utilisés. Mais utilisé par quoi?
Réponses:
GCC est livré avec une bibliothèque d'exécution du compilateur (libgcc) qu'il utilise pour (entre autres) fournir une abstraction du système d'exploitation de bas niveau pour les fonctionnalités liées au multithreading dans les langages qu'il prend en charge. L'exemple le plus pertinent est libstdc ++ 's C ++ 11
<thread>
,<mutex>
et<future>
qui ne dispose pas d' une mise en œuvre complète lorsque GCC est construit avec son modèle de thread Win32 interne. MinGW-w64 fournit un winpthreads (une implémentation pthreads au-dessus de l'API multithreading Win32) que GCC peut ensuite lier pour activer toutes les fonctionnalités sophistiquées.Je dois souligner que cette option ne vous interdit pas d'écrire le code que vous voulez (elle n'a absolument AUCUNE influence sur l'API que vous pouvez appeler dans votre code). Il ne reflète que ce que les bibliothèques d'exécution de GCC (libgcc / libstdc ++ / ...) utilisent pour leurs fonctionnalités. La mise en garde citée par @James n'a rien à voir avec le modèle de threading interne de GCC, mais plutôt avec l'implémentation CRT de Microsoft.
Résumer:
posix
: activer les fonctionnalités de multithreading C ++ 11 / C11. Rend libgcc dépendante de libwinpthreads, de sorte que même si vous n'appelez pas directement l'API pthreads, vous distribuerez la DLL winpthreads. Il n'y a rien de mal à distribuer une autre DLL avec votre application.win32
: Pas de fonctionnalités multithreading C ++ 11.Aucun des deux n'a d'influence sur le code utilisateur appelant les API Win32 ou les API pthreads. Vous pouvez toujours utiliser les deux.
la source
g++-mingw-w64-x86-64
fournit deux fichiersx86_64-w64-mingw32-g++-win32
etx86_64-w64-mingw32-g++-posix
, etx86_64-w64-mingw32-g++
est associé à l'un d'eux; voirupdate-alternatives --display x86_64-w64-mingw32-g++
.--threads=win32
. Donc tant que les bits manquants ne sont pas implémentés dans GCC, vous devez configurer GCC avec--threads=win32
.Certaines parties du runtime GCC (la gestion des exceptions, en particulier) dépendent du modèle de thread utilisé. Donc, si vous utilisez la version du runtime qui a été construite avec les threads POSIX, mais que vous décidez de créer des threads dans votre propre code avec les API Win32, vous risquez de rencontrer des problèmes à un moment donné.
Même si vous utilisez la version de threading Win32 du runtime, vous ne devriez probablement pas appeler directement les API Win32. Citant la FAQ MinGW :
la source
Notez qu'il est maintenant possible d'utiliser une partie de C ++ 11 std :: thread dans le mode de threading win32. Ces adaptateurs d'en-tête uniquement ont fonctionné pour moi: https://github.com/meganz/mingw-std-threads
D'après l'historique des révisions, il semble qu'il y ait eu une tentative récente d'en faire une partie du runtime mingw64.
la source