8
votes

Dossier simultané écrit

Comment écrire dans un fichier texte accessible par plusieurs sources (éventuellement de manière concomitante) en veillant à ce qu'aucune opération d'écriture ne soit perdue?

Comme, si deux processus différents écrivent au même moment du fichier, cela peut entraîner des problèmes. La solution Simples (pas très rapide et pas très élégante) verrouille le fichier tout en commençant le processus (créez un fichier .lock ou similaire) et libérez-le (supprimer le verrou) pendant que l'écriture est effectuée.

Lorsque vous commencez à écrire, je vérifierais si le fichier .lock existe et retarde l'écriture jusqu'à ce que le fichier soit libéré. ​​

Quel est le modèle recommandé à suivre pour ce type de situation?

merci

edit Je veux dire des processus, comme différents programmes de différents clients, différents utilisateurs, etc., pas sur le threads dans le même programme


1 commentaires

Vous voulez dire deux processus ou threads différents? Cause Si vous souhaitez avoir un accès sécurisé à un fichier pour quelques processus, il n'y a pas grand chose que vous puissiez faire sans utiliser du mutex, ni autre mécanisme de verrouillage inter procédé.


6 Réponses :


1
votes

Je suggère d'utiliser la ReaderWratterLock. Il est conçu pour plusieurs lecteurs mais ne garantit qu'un seul écrivain peut nuire aux données d'écrivain à une fois MSDN .


5 commentaires

N'utilisez pas ReaderWratterLock, il a une mauvaise performance. Utilisez ReaderWriterLocksLIM ou l'une des serrures de Jeffrey Richter dans la bibliothèque de PowerTheading Wintellect.


Ne pas utiliser ni;). Les verrous, les moniteurs (verrous), etc. ne sont pas capables de verrouiller entre les processus, ce que l'auteur signifiait que je pense (comme si deux processus différents écrivent au même moment du fichier)?


N'utilisez pas le verrouillage de la interprocession. Passer à un système d'exploitation qui ne fait qu'un processus à la fois.


Ouais, commençons tous à utiliser MS-DOS


Ravadre, en effet, ils ne travaillent pas dans des processus, mais cette réponse était bien avant la modification. Je laisserai ici cependant au cas où quelqu'un d'autre trébuche à travers elle à la recherche de mêmes solutions de processus.



0
votes

Vous pouvez essayer de verrouiller aussi. C'est facile - "La serrure garantit qu'un thread n'entre pas une section critique tandis qu'un autre thread est dans la section critique du code. Si un autre thread tente d'entrer un code verrouillé, il attendra (bloc) jusqu'à ce que l'objet soit libéré." / p>

http://msdn.microsoft.com /en-us/library/c5kehkcz%28vs.71%29.aspx


1 commentaires

En fait, l'utilisation de moniteur (verrouillage) est moins chère, puis ReaderWriterLockSlim.enterRwritelock + sortie. Il est bon d'utiliser RW Serrure, lorsque vous avez peu de lecteurs et d'écrivains, mais dans ce cas, vous ne lirez plutôt pas à partir du fichier, car il s'agit simplement d'un fichier journal, vous y écrirez pour la plupart, vous devrez donc utiliser des writelocks. Seulement de toute façon -> Par conséquent, vous ne pourrez donc pas accéder simultanément à la ressource -> Par conséquent, vous pouvez utiliser une serrure régulière. Ne pas mentionner que les deux ne fonctionnent pas pour la synchronisation intervenue.



1
votes

Je regarderais quelque chose comme le Modèle de commande pour le faire. L'écriture simultanée serait un cauchemar pour l'intégrité des données.

Essentiellement, vous utilisez ce modèle pour faire la queue de vos commandes d'écriture afin qu'elles soient faites dans l'ordre de la demande.

Vous devez également utiliser ReaderWriterLock à Assurez-vous de lire dans le fichier pendant que vous écrivez. Ce serait une deuxième ligne de défense derrière le modèle de commande afin qu'un seul thread puisse écrire dans le fichier à un moment donné.


2 commentaires

+1 Pour recommander à l'aide d'une file d'attente, mais je vous ai presque dîné pour le commentaire RW-Lock après. La file d'attente gère ses propres serrures ... Quoi d'autre vous verrouillez-vous?


Je l'envisageons plus pour une deuxième ligne de défense. Ce qui, dans la vue arrière, je pense qu'il y a une meilleure façon de le faire que d'utiliser le RWL, mais je détesterais à l'aider à optimiser prématurément malgré les chutes de la performance de la RWL. Cependant, je commence à me demander s'il voulait dire plusieurs processus / applications différents d'accès et d'écriture à un fichier, et si oui, alors les deux de ces deux ne valaient rien.



2
votes

Pensez à utiliser une base de données simple. Vous obtiendrez toute cette sécurité intégrée relativement facile.


0 commentaires

2
votes

Le moyen le plus rapide de synchroniser l'accès entre les processus consiste à utiliser les mutiles / sémaphores. Ce fil répond à comment les utiliser, pour simuler le motif de verrouillage de lecture en lecture: Y a-t-il un lecteur nommé global / serrure écrivain?


2 commentaires

Il existe un moyen d'utiliser un mutex nommé pouvant être référencé à partir de plusieurs processus. Si tout accès de fichier provient d'un seul processus (mais plusieurs threads), ils peuvent tous indiquer le même mutex pour acquérir la serrure.


Kieveli - L'auteur signifiait différents processus, donc - les mutiles / sémaphoers sont les choix les plus évidents, et c'est pourquoi j'ai écrit à leur sujet, si nous nous parlons de parler de threads, les mutilations et les constructions plus simples comme ReadwreLock fonctionnent.



0
votes

Je vous recommanderais également de rechercher des exemples d'avoir plusieurs lecteurs et un seul écrivain dans une section critique Heres un papier court avec une bonne solution http://arxiv.org/ps_cache/cs/pdf/0303/0303005v1.pdf

Vous pouvez également consulter la création de copies du fichier chaque fois qu'il est demandé et qu'il est temps d'écrire des modifications apportées au fichier que vous fusionnez avec le fichier d'origine.


0 commentaires