mingw-w64 threads: posix vs win32

j'installe mingw-w64 sur Windows et il y a deux options: Win32 threads et posix threads. Je sais quelle est la différence entre win32 threads et pthreads, mais je ne comprends pas quelle est la différence entre ces deux options. Je doute que si je choisis des 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 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 permettra l'utilisation de std::thread, et les threads-win32 utiliseront l'API win32, et désactiveront la partie std::thread de la norme.

Ok, si je va sélectionner threads puis std:: thread sera indisponible, mais win32 threads sera toujours utilisé. Mais utilisé par quoi?

79
demandé sur Community 2013-06-21 23:01:16

3 réponses

GCC est livré avec une bibliothèque d'exécution de compilateur (libgcc) qu'il utilise pour (entre autres choses) fournir une abstraction OS de bas niveau pour la fonctionnalité liée au multithreading dans les langues qu'il supporte. L'exemple le plus pertinent est libstdc++'S C++11 <thread> , <mutex> , et <future> , qui n'ont pas une implémentation complète lorsque GCC est construit avec son modèle de threading Win32 interne. MinGW-w64 fournit un winpthreads (une implémentation pthreads en haut du Win32) multithreading API) que GCC peut alors relier pour activer toutes les fonctionnalités de fantaisie.

je dois souligner que cette option Ne vous interdit pas d'écrire n'importe quel code que vous voulez (il a absolument Non influence sur ce que L'API que vous pouvez appeler dans votre code). Il ne reflète que les bibliothèques d'exécution de GCC (libgcc / libstdc++/...) d'utiliser pour leur fonctionnalité. L'avertissement cité par @James n'a rien à voir avec le modèle de threading interne de GCC, mais plutôt avec le CRT de Microsoft. application.

pour résumer:

  • posix : activez les fonctions de multi-lecture C++11/C11. Fait que libgcc dépend 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 DLL de plus avec votre application.
  • win32 : Pas de C++11 multithreading fonctionnalités.

ni L'un ni l'autre ont une influence sur tout code utilisateur appelant Win32 APIs ou pthreads APIs. Vous pouvez toujours utiliser les deux.

69
répondu rubenvb 2015-05-22 07:00:24

parties du temps D'exécution GCC (la manipulation d'exception, en particulier) dépendent du modèle de filetage utilisé. Donc, si vous utilisez la version de l'exécution qui a été construite avec les threads POSIX, mais décidez de créer des threads dans votre propre code avec les API Win32, vous êtes susceptible d'avoir des problèmes à un moment donné.

même si vous utilisez la version Win32 threading du runtime, vous ne devriez probablement pas appeler les API Win32 directement. Citant le MinGW FAQ :

comme MinGW utilise la bibliothèque Standard Microsoft C runtime qui est livrée avec Windows, vous devez être prudent et utiliser la fonction correcte pour générer un nouveau thread. En particulier, la fonction CreateThread ne configurera pas la pile correctement pour la bibliothèque C runtime. Vous devez utiliser _beginthreadex à la place, qui est (presque) complètement compatible avec CreateThread .

15
répondu James Holderness 2016-05-21 04:27:25

notez qu'il est maintenant possible d'utiliser du C++11 std::thread dans le mode de threading win32. Ces adaptateurs header-only ont fonctionné hors de la boîte pour moi: https://github.com/meganz/mingw-std-threads

D'après l'historique des révisions, il semble qu'il y ait une tentative récente de faire en sorte que cela fasse partie de l'exécution mingw64.

10
répondu Tom 7 2015-09-19 15:32:58