En arrière, je pensais à la manière de mettre en œuvre divers primitifs de synchronisation en termes d'une autre. Par exemple, dans Pthreads, vous obtenez des mutiles et des variables de condition, et à partir de ceux-ci peuvent construire des sémaphores. P>
Dans l'API Windows (ou au moins, les anciennes versions de l'API Windows) Il existe des mutiles et des sémaphores, mais aucune variables de condition. Je pense qu'il devrait être possible de construire des variables de condition hors des mutiles et des sémaphores, mais pour la vie de moi, je ne peux tout simplement pas penser à un moyen de le faire. P>
Quelqu'un peut-il connaître une bonne construction pour ce faire? P>
3 Réponses :
Un moyen d'implémenter des sémaphores donnés sur une mise en œuvre est d'ajouter un processus de serveur au système, d'utiliser des sémaphores pour communiquer avec elle et de faire le processus difficile de la mise en œuvre de X. En tant qu'exercice académique, cela pourrait être tricherie, Mais il faut faire le travail, et il peut être plus robuste de mauvaise conduite par les processus du client, ou à leur mort subite. P>
Umm, sauf si "sémaphore" signifie quelque chose de complètement différent dans les API Windows, ils ne sont pas quelque chose que vous communiquez avec.
Un processus peut définir un sémaphore et un autre processus peut le tester pour voir s'il a été défini ou non. Deux machines peuvent communiquer des messages arbitraires en testant et en définissant les tensions en deux fils. Deux processus peuvent communiquer des messages arbitraires en testant et en définissant l'état des sémaphores. En pratique, vous utiliseriez probablement les sémaphores uniquement pour réguler l'accès à la mémoire partagée, mais je considère les deux cas comme communication - même si tout ce que vous communiquez est «OK - vous pouvez lire la mémoire partagée maintenant».
Il me manque peut-être quelque chose ici, mais il semble y avoir un moyen plus simple de mettre en œuvre une condition à partir d'un sémaphore et d'une serrure que la voie décrite dans le papier.
Je pense que cela devrait surtout fonctionner, mais théoriquement, votre dernier serveur pourrait être préempté entre SEM_WAIT un pthead_mutex_lock par un signal d'appel de fil - et cela gâcherait votre valeur de sémaphore. Il est difficile de faire comprendre ces choses pour toutes les entrelacées possibles de threads.
Condition :: Wait () La méthode a une section critique à this-> m_waiter ++; code> et ne peut pas fonctionner correctement