mingw std :: thread avec l’API Windows

J’ai commencé à utiliser C ++ 11 std::thread (mingw 4.8) jusqu’ici tout va bien. J’ai rencontré une situation où les entrées / sorties se chevauchaient, où sleepEx était utilisé pour placer le thread dans un état d’attente pouvant être alerté. Cela a très bien fonctionné, jusqu’à QueueUserAPC que QueueUserAPC ait été utilisé, ce qui a renvoyé une “erreur de QueueUserAPC non valide”.

Après quelques recherches ont découvert que std::thread utilise la bibliothèque pthread sous Windows.

Est-il possible d’utiliser les appels d’API Windows qui attendent un handle de thread avec std::thread ? Ou dois-je respecter les threads Windows pour les E / S superposées?

Est-il possible d’utiliser les appels d’API Windows qui attendent un handle de thread avec std :: thread?

Non, car le std::thread de votre version MinGW n’est pas implémenté en termes de descripteurs de thread. Edit: c’est, mais indirectement, voir la réponse de rubenvb sur la façon d’obtenir le handle de thread natif à partir d’un pthread_t , et vous devriez pouvoir utiliser std::thread::native_handle() pour obtenir le pthread_t .

Personne n’a mis en œuvre le support nécessaire dans GCC pour que la bibliothèque de threads C ++ 11 utilise directement les threads Windows natifs.

J’ai eu quelques idées pour un nouveau modèle thead qui serait implémenté en termes de mutex natifs et de variables de condition. Cela vous permettrait d’appeler std::thread::native_handle() pour obtenir le handle de thread sous-jacent à utiliser avec l’API Windows.

Je suis allé jusqu’à reconstruire GCC avec mes modifications appliquées, mais je n’ai pas pu les tester. Il n’y avait presque aucun intérêt pour mes suggestions et aucune offre d’aide de la part des consortingbuteurs MinGW, alors comme je ne suis pas un utilisateur Windows, et travailler sur Windows et construire MinGW était tellement douloureux et frustrant, j’ai abandonné. Je devrais mettre mes modifications en ligne quelque part, de sorte que quelqu’un avec plus de patience que moi puisse terminer le travail un jour.

Pour résoudre votre problème, MinGW-w64 winpthreads (l’implémentation pthreads que vous utilisez), tout comme pthreads-win32 , vous permet d’obtenir le handle de thread Win32 natif pour un pthread:

 void * pthread_gethandle (pthread_t t); 

Notez que ceci est actuellement une fonction non documentée.

La fonction correspondante dans pthreads-win32 est la suivante:

 HANDLE pthread_getw32threadhandle_np(pthread_t thread); 

Je parie que cela vous permettra de mélanger les deux, ou au moins de mettre en évidence des bogues dans winpthreads qui peuvent être corrigés. Dans ce dernier cas, veuillez les signaler à MinGW-w64.

Si ce qui précède retourne un descripteur invalide, le mieux est de le demander sur la liste de diffusion MinGW-w64-public (abonnez-vous en premier, sinon vous devrez attendre la modération manuelle, ce qui est idiot).

Il existe déjà une implémentation native de Win32 des primitives std :: thread et sync, voir:

https://github.com/meganz/mingw-std-threads

Ceci est une bibliothèque en-tête uniquement et fonctionne avec toute version de MinGW qui prend en charge la langue appropriée pour C ++ 11