2011-06-11 5 views
1

J'ai implémenté l'algorithme de Peterson pour l'exclusion mutuelle dans la mémoire partagée. J'utilise la mémoire partagée entre un processus C++ et un processus java (en utilisant jni) pour la communication. Le problème est que je vois encore une condition de course en quelque sorte. Si j'essaie de le déboguer en utilisant printf/println, le code commence à fonctionner correctement, mais dès que j'enlève ces empreintes, les processus se bloquent. Quelqu'un peut-il m'éclairer où pourrait être le problème? Je suis tout à fait sûr que la mise en œuvre de l'algorithme de Peterson est correcte. Devrais-je utiliser des sémaphores (semget()) à la place pour une exclusion mutuelle?problème dans le verrou de Peterson dans la mémoire partagée

Répondre

4

Pour implémenter l'algorithme correctement, vous devez utiliser des barrières pour vous assurer que la mémoire est lue/écrite dans l'ordre que vous spécifiez dans le code. Lire le deuxième paragraphe de here:

La plupart des processeurs modernes réorganisent les accès mémoire pour améliorer l'efficacité de l'exécution (voir l'ordre de la mémoire pour les types de réorganisation autorisés). De tels processeurs donnent invariablement un moyen de forcer l'ordre dans un flux d'accès mémoire, typiquement à travers une instruction de barrière de mémoire. La mise en œuvre des algorithmes de Peterson et des algorithmes apparentés sur les processeurs qui réorganisent les accès mémoire nécessite généralement l'utilisation de telles opérations pour fonctionner correctement afin d'empêcher les opérations séquentielles de se produire dans un ordre incorrect. Notez que la réorganisation des accès mémoire peut se produire même sur les processeurs qui ne réorganisent pas les instructions (comme le processeur PowerPC de la Xbox 360).

Et oui, utilisez les mécanismes de synchronisation fournis par le système (mutex) au lieu de réinventer la roue.

+0

j'aurais pensé à la remise en ordre de la mémoire! En tout cas merci beaucoup. Je vais utiliser des mutexes maintenant. – Neal

0

Je pense que votre problème serait lié non pas à l'exclusion mutuelle, mais à la sychronisation. L'algorithme de Peterson ne sécurise qu'un processus dans la région critique et ne détermine pas quels processus doivent être dans la région critique. Si votre problème est juste ce que je mentionne, je suggère d'utiliser Moniter comme sycronyzing.

0

Une partie critique de votre code doit être partagée par le processus. Lorsque vous exécutez le programme sans verrou, la sortie sera différente et ambiguë, d'où nous pouvons vérifier si votre code fonctionne.

Le problème est que vous utilisez une instruction print et que vous devez partager quelque chose lorsque vous les supprimez.

Pouvez-vous partager la logique ce que vous utilisez pour PETERSON'S ALGORITHME

visite: Peterson Algorithm

Questions connexes