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
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.
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.
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
- 1. problème avec la mémoire partagée
- 2. Peterson Lock dans un arbre binaire
- 3. fuite de mémoire partagée C++, comment effacer la mémoire partagée?
- 4. Mémoire partagée, écrire dans le fichier
- 5. Boost problème de mémoire partagée interprocess
- 6. matrice opencv dans la mémoire partagée
- 7. Fractionner la mémoire partagée?
- 8. mémoire globale vs mémoire partagée dans CUDA
- 9. Mémoire tampon unique producteur/consommateur dans la mémoire partagée
- 10. Augmenter la mémoire pour la mémoire partagée
- 11. Simulation cuda nbody - problème de mémoire partagée
- 12. Problème d'initialisation de mémoire partagée (c)
- 13. Mémoire partagée dans les DLL
- 14. Instanciation d'objets dans la mémoire partagée C++
- 15. CUDA - détermine le nombre de banques dans la mémoire partagée
- 16. Mémoire partagée gratuite dans CUDA
- 17. Charger la mémoire partagée dans C
- 18. copie char * dans la mémoire partagée boost
- 19. Comment implémenter la mémoire partagée dans .NET?
- 20. `boost :: multi_index_container` dans la mémoire partagée?
- 21. Sémaphore de mémoire partagée
- 22. listes de liens multiples dans la mémoire partagée dans Linux
- 23. Différence entre la mémoire partagée et le canal dans unix?
- 24. protéger la zone de mémoire partagée dans les multiprocesseurs
- 25. Mémoire partagée de synchronisation
- 26. Utilisation de la mémoire partagée dans un threads
- 27. Ecriture en mémoire partagée
- 28. Libération de la mémoire d'un noeud dans la mémoire partagée à l'aide de la bibliothèque boost
- 29. Occurrence partagée de verrou d'indicateur personnalisé Objective-c
- 30. confusion de l'optimisation de la mémoire partagée
j'aurais pensé à la remise en ordre de la mémoire! En tout cas merci beaucoup. Je vais utiliser des mutexes maintenant. – Neal