2010-07-30 7 views
1

J'ai un problème unique. Deux processus (P0 et P1) tentent d'accéder à un fichier. P0 écrit des informations dans le fichier et P1 lit les informations. Il y a une condition de concurrence entre les deux dans laquelle P1 est en train de lire avant que P0 ait fini d'écrire. J'ai envisagé d'utiliser des verrous, des sémaphores, etc. Cependant, P1 existe dans un ensemble de code que je ne suis pas autorisé à modifier de quelque façon que ce soit, et il n'a actuellement aucune implémentation pour supporter les corrections proposées ci-dessus.Exclusion mutuelle sans toucher aux deux processus

Est-il possible de supprimer cette condition de concurrence sans toucher les deux ensembles de codes?

Répondre

0

Vous pouvez laisser P0 écrire dans le fichier A et laisser P1 lire le fichier B. Lorsque P0 a terminé d'écrire le fichier, renommez le fichier A en fichier B. Vous devez vous assurer que l'opération de renommage est atomique.

+0

C'était en fait ma solution temporaire au problème. Il résout une grande partie du problème (lié à l'affichage d'une image à l'écran), mais les éléments du problème persistent. Je soupçonne que l'opération de renommage n'est pas complètement atomique. Il fonctionne sur une machine Linux, ce que j'ai lu n'est pas complètement compatible avec le standard POSIX. – Mark

+0

Que se passe-t-il si vous supprimez B en premier, puis renommez A en B? Est-ce que P1 renvoie une erreur et quitte? – Cahit

+0

Le programme se poursuit normalement. J'ai remarqué que la suppression du fichier non temporaire n'a aucun effet sur le conflit. P1 se trouve également être le code du serveur web, que je n'ai aucun moyen de voir. Il se peut qu'il y ait trop de paramètres inconnus dans ce numéro. – Mark

0

La solution de Niels est géniale, mais peut ne pas être applicable si c'est un gros fichier avec de petits deltas. Je vais suggérer que votre solution dépendra de:
a) si P1 est le verrouillage du fichier et vous voulez juste juste se débarrasser du conflit,
b) si vous devez vous assurer que ce que P1 lit est toujours la copie mise à jour avec les changements de P0, et
c) si P1 honore un verrou de lecture sur le fichier en question.

Recherchez également les appels système O/S sous-jacents pour voir si vous pouvez suivre le comportement de P1 à l'intérieur de PO pour coordonner les processus. Par exemple, pour Windows, la classe .NET System.Diagnostics.Process peut fournir des méthodes utiles.