2010-02-23 25 views
2

Cela m'a déconcerté pendant longtemps.Comment les variables de condition sont-elles implémentées?

Étant donné les primitives atomiques de base comme comparer & swap, je peux voir comment implémenter un verrou de spin (à partir duquel je peux construire des mutex).

Cependant, je ne vois pas comment je peux construire des variables de condition à partir de cela. Comment cela est-il fait?

Répondre

2

Ce n'est pas particulièrement simple. Ce qui suit est un lien vers un article de Douglas Schmidt (qui est également largement responsable des bibliothèques ACE) qui détaille plusieurs approches pour implémenter des variables de condition sur Windows en utilisant les primitives de synchronisation disponibles dans Win32 (pré-Vista). Les approches comprennent l'utilisation que les fonctionnalités de base, généralement disponibles sur les primitives OS, et analyse les différentes limites des approches:

La ligne de fond (observations finales):

Cet article explique pourquoi développer des variables de condition sur les plates-formes Win32 est délicat et sujet aux erreurs. Il existe plusieurs forces de conception subtiles qui doivent être traitées par les développeurs. En général, les différentes implémentations que nous avons examinées varient selon leur exactitude, leur efficacité, leur équité et leur portabilité. Aucune solution ne fournit toutes ces qualités de façon optimale.

La solution SignalObjectsAndWait de la section 3.4 est une bonne approche si l'équité est primordiale. Cependant, cette approche n'est pas aussi efficace que d'autres solutions, et n'est pas aussi portable. Par conséquent, si l'efficacité ou la portabilité sont plus importantes que l'équité, l'approche SetEvent décrite dans la section 3.2 peut être plus appropriée. Naturellement, la solution la plus simple serait que Microsoft fournisse simplement des variables de condition dans l'API Win32.

Notez que à partir de Vista, Windows prend en charge les variables de condition en utilisant des API natives: