2009-08-02 8 views
10

Je souhaite avoir des variables de condition de style POSIX sous Win32. J'ai un code qui doit fonctionner sous XP, donc je ne peux pas utiliser Vista/Server 2008 CONDITION_VARIABLE.Implémentation de variables de condition pour CRITICAL_SECTIONs pour Winthreads pour XP

Il utilise actuellement une classe de variables de pseudo-condition, basée sur le fait de quitter la section critique et de signaler un événement de réinitialisation automatique pour la signalisation/le réveil. Pour attendre sur la variable de condition, il quitte la section critique, WaitForSingleObject s sur l'événement, puis rentre dans la section critique. C'est plutôt bien, mais cela ne supporte pas la diffusion, et peut avoir d'autres problèmes d'équité, dont je ne me soucie pas trop. Nous utilisons boost, donc je sais que je pourrais utiliser boost threads ou pthreads-win32, qui supportent les variables de condition, mais idéalement je voudrais que l'interface soit telle que je puisse tomber dans l'implémentation de Microsoft quand/si devient possible de l'utiliser directement. J'ai vu Strategies for Implenting POSIX Condition Variables on Win32, mais la meilleure solution (la plus correcte) utilise un Mutex et non un CRITICAL_SECTION. Il y a un croquis d'une implémentation avec CRITICAL_SECTION dans le second part, mais il n'est pas complet, et les autres solutions avec CRITICAL_SECTION me concernent en raison des soucis décrits pour eux dans l'article. En bref, comment implémenter une variable de condition correcte, pas forcément juste (mais qui serait sympa) sur win32 pour les sections critiques, de sorte que je puisse tomber dans l'implémentation de Microsoft quand elle sera disponible pour moi?

Répondre

6

Les articles auxquels vous faites référence ont été rédigés par des collègues à titre d'exemple de notre travail sur le framework ACE C++ et ses façades d'enveloppes OS. Comme mentionné dans ma bio, "Je ne fais pas Windows", mais je travaille encore activement sur ACE, et j'ai juste jeté un oeil, et il semble que l'implémentation de la variable condition pour Win32 utilise CRITICAL_SECTION (lors de l'inspection initiale, il semble que c'est juste en utilisant un mutex, mais si vous creusez plus profondément, vous trouverez qu'il y a une couche ci-dessous dans laquelle un mutex est défini comme CRITICAL_SECTION sur les plates-formes Windows). Pour vérifier que le code n'a pas été modifié pour utiliser les nouvelles API de Vista, la base de code que j'ai vérifiée est en fait une branche de la ligne de 1.5. En supposant que vous vouliez juste une API C pour les variables de condition, et non les encapsuleurs C++, tout ceci devrait être contenu dans un seul ensemble de fichiers: ace/OS_NS_Thread.{h,inl,cpp} La licence sur ACE est très généreuse, et non GPL, donc vous pouvez Soulevez le code à partir de là dans la base de code propriétaire sans craindre "la contamination par la GPL".

Vous pouvez obtenir des versions de ACE à http://download.dre.vanderbilt.edu/; la version que j'ai inspectée est une version commercialement supportée dérivée de ACE 5.5.2, maintenue par OCI et disponible au téléchargement au http://www.theaceorb.com/downloads/1.5a/index.html. Par souci de divulgation complète, je suis un utilisateur/contributeur/mainteneur de longue date d'ACE, j'ai travaillé pendant un certain temps pour ce personnel de recherche et je suis maintenant employé d'OCI. Je ne pense pas que cela modifie l'utilité/l'applicabilité de ce code pour vous, et aucune des entités susmentionnées ne tire de revenus de votre code de levée de la source.

+0

Ça a l'air bien! Merci beaucoup. –

Questions connexes