web-dev-qa-db-fra.com

discussions sur les threads W64: posix vs win32

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 des threads posix, cela m'empêche d'appeler des fonctions WinAPI telles que CreateThread.

Il semble que cette option spécifie quelle API de thread 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 portage de windows de gcc?

En bref, pour cette version de mingw, la version de threads-posix utilisera l’API posix et autorisera l’utilisation de std :: thread, tandis que threads-win32 utilisera l’API win32 et désactivera la partie std :: thread du la norme.

Ok, si je sélectionne les threads win32, alors std :: thread sera indisponible mais les threads win32 seront toujours utilisés. Mais utilisé par quoi?

97
Simon

GCC est livré avec une bibliothèque d'exécution du compilateur (libgcc) qu'il utilise (entre autres) pour fournir une abstraction de système d'exploitation de bas niveau pour les fonctionnalités multithreads dans les langages qu'il prend en charge. L'exemple le plus pertinent est le C++ 11 <thread>, <mutex> Et <future> De libstdc ++, qui n'ont pas d'implémentation complète lorsque GCC est construit avec son modèle de threading Win32 interne. MinGW-w64 fournit un winpthreads (une implémentation de pthreads en plus de l'API multithreading Win32) auquel GCC peut ensuite se 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 a absolument NON influence sur quelle API vous pouvez appeler dans votre code). Cela reflète uniquement ce que les bibliothèques d'exécution de GCC (libgcc/libstdc ++/...) utilisent pour leurs fonctionnalités. L'avertissement cité 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: active les fonctionnalités multithreading C++ 11/C11. Libgcc dépend de libwinpthreads. Ainsi, même si vous n'appelez pas directement l'API pthreads, vous distribuerez la DLL winpthreads. Il n'y a rien de mal à en distribuer un de plus DLL avec votre application.
  • win32: Aucune fonctionnalité multithreading C++ 11.

Aucun des deux n'a d'influence sur un code utilisateur appelant des API Win32 ou des API pthreads. Vous pouvez toujours utiliser les deux.

95
rubenvb

Certaines parties de l'exécution de GCC (la gestion des exceptions, en particulier) dépendent du modèle de thread utilisé. Ainsi, si vous utilisez la version du moteur d'exécution construite avec les threads POSIX, mais décidez de créer des threads dans votre propre code avec les API Win32, vous risquez d'avoir des problèmes à un moment donné.

Même si vous utilisez la version de thread d'exécution Win32 du moteur d'exécution, vous ne devriez probablement pas appeler les API Win32 directement. Citant le MinGW FAQ :

MinGW utilisant la bibliothèque d’exécution Microsoft C standard livrée avec Windows, vous devez faire preuve de prudence et utiliser la fonction appropriée pour générer un nouveau thread. En particulier, la fonction CreateThread ne configurera pas la pile correctement pour la bibliothèque d'exécution C. Tu devrais utiliser _beginthreadex à la place, qui est (presque) complètement compatible avec CreateThread.

15
James Holderness

Notez qu'il est maintenant possible d'utiliser une partie de C++ 11 std :: thread en mode de threading win32. Ces adaptateurs d’en-tête seulement fonctionnent parfaitement pour moi: https://github.com/meganz/mingw-std-threads

D'après l'historique des révisions, il semble y avoir eu une tentative récente d'intégrer cela à l'exécution de mingw64.

11
Tom 7