threads mingw-w64: posix vs win32

129

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?

Simon
la source
Utilisé par les applications créées à l'aide de ce fichier gcc.
devnull
@devnull, n'est-ce pas déterminé par l'API que j'utiliserai? Si je sélectionne la version pthreads de MinGW, qu'est-ce qui m'empêchera d'utiliser WinAPI pour les threads?
Simon
gcc va vous empêcher, ou plutôt: devenir instable
jiggunjer

Réponses:

124

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.

rubenvb
la source
7
Vous pouvez toujours lier le runtime gcc et winpthreads de manière statique, supprimant ainsi la nécessité de l'inclusion de DLL.
Alexander Shishenko
3
Il m'a fallu un certain temps pour trouver l'option correspondante sur Linux, donc au cas où cela aiderait quelqu'un d'autre: Le paquet g++-mingw-w64-x86-64fournit deux fichiers x86_64-w64-mingw32-g++-win32et x86_64-w64-mingw32-g++-posix, et x86_64-w64-mingw32-g++est associé à l'un d'eux; voir update-alternatives --display x86_64-w64-mingw32-g++.
stewbasic
Hmm, vous dites "... qui n'ont pas d'implémentation complète lorsque GCC est construit avec son modèle de thread Win32 interne .... MinGW-w64 fournit un winpthreads (une implémentation pthreads en plus de l'API multithreading Win32) que GCC peut puis connectez-vous pour activer toutes les fonctionnalités sophistiquées. " Donc, si je sélectionne le modèle win32, GCC peut toujours activer toutes les fonctionnalités, car il utilise winpthreads? Mais dans la puce ci-dessous, vous écrivez "win32: No C ++ 11 multithreading features". Je ne comprends pas. Est-ce que "à quel GCC peut se connecter à ..." signifie que si je ne sélectionne pas win32, il peut alors sélectionner ...?
Johannes Schaub - litb
@ JohannesSchaub-litb Eh bien, non. La magie de configuration de GCC couple la sélection du modèle de thread interne aux fonctionnalités activées de libstdc ++ car cette dernière est construite sur le wrapper interne "gthread" de GCC (qui est juste une fine abstraction de thread de type posix. Il manque des éléments fondamentaux pour les fonctionnalités C ++ 11. dans cette couche lorsque vous utilisez --threads=win32. Donc tant que les bits manquants ne sont pas implémentés dans GCC, vous devez configurer GCC avec --threads=win32.
rubenvb
Puis-je utiliser les bibliothèques précompilées mingw de qt, qui utilisent -win32, avec d'autres bibliothèques qui utilisent -posix, et utiliser les deux bibliothèques dans le même programme?
Johannes Schaub - litb
16

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 :

Comme MinGW utilise la bibliothèque d'exécution Microsoft C standard fournie avec Windows, vous devez être prudent et utiliser la fonction appropriée pour générer un nouveau thread. En particulier, la CreateThreadfonction ne configurera pas correctement la pile pour la bibliothèque d'exécution C. Vous devriez utiliser à la _beginthreadexplace, qui est (presque) complètement compatible avec CreateThread.

James Holderness
la source
7
Dans ce cas, qu'en est-il des bibliothèques de threads tierces comme boost ou Qt? Est-il possible d'utiliser ces bibliothèques avec mingw64 sans avoir à trouver la bibliothèque de threads sous-jacente pour celles-ci? Que se passerait-il si je décidais arbitrairement d'utiliser boost :: threads avec la variante posix de mingw?
tantuni
1
@ user460153 quelques infos qt-project.org/wiki/…
Alex V.
10
Cette réponse est fausse. Le runtime GCC n'a absolument aucune influence sur les API Win32.
rubenvb
Lisez l'entrée FAQ liée. Cette réponse est correcte.
Daira Hopwood le
13

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.

Tom 7
la source