2009-07-21 26 views
7

書き込み操作が失われないように、複数のソースからアクセスできるテキストファイルへの書き込み方法(並行モードでも可能)同時ファイル書き込み

同様に、2つの異なるプロセスが同じ瞬間にファイルに書き込みを行っている場合は、問題が発生する可能性があります。シンプルなソリューション(非常に高速ではなく、あまりエレガントではない)は、書き込みが完了している間にプロセスを開始している間にファイルをロックし(.lockファイルなどを作成する)、解放する(ロックを削除する)。

書き込みを開始するときは、.lockファイルが存在するかどうかを確認し、ファイルが解放されるまで書き込みを遅らせます。

このような状況で推奨されるパターンは何ですか?

おかげ

EDITは 私はさまざまなクライアント、異なるユーザーなど、同じプログラム

+0

あなたは2つの異なるプロセスまたはスレッドを意味しますか?なぜなら、いくつかのプロセスで1つのファイルに安全にアクセスしたいのであれば、Mutexやその他のプロセス間ロック機構を使わなければ、あまりできることはありません。 –

答えて

1

内のスレッドではなく、私はReaderWriterLockを使用することをお勧め異なるプログラムのようなプロセスを意味します。これは複数のリーダー向けに設計されていますが、一度に1人のライターだけがライターデータを確実に取得できるようにしますMSDN

+2

ReaderWriterLockは使用しないでください。パフォーマンスが低下します。 Wintellect PowerThreadingライブラリのReaderWriterLockSlimまたはJeffrey Richterのロックの1つを使用します。 –

+1

どちらも使用しないでください;)。 ReadWriterロック、モニタ(ロック)などプロセス間ロックはできません。これは、著者が私が思っていたことを意味しています(2つの異なるプロセスが同じ瞬間にファイルに書き込んでいる場合など)。 –

+1

プロセス間ロックは使用しないでください。一度に1つのプロセスだけを実行するOSに切り替えます。 – Kieveli

0

ロックを試すこともできます。もう一つのスレッドがロックされたコードを入力しようとすると、オブジェクトが解放されるまで待つ(ブロックする)。

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

+0

私はこれが単純なReaderWriterLockを使うよりも高価だと信じています。 – Ian

+0

実際には、monitor(lock)を使用するほうが安く、ReaderWriterLockSlim.EnterWriteLock + ExitLockです。読者とライターがほとんどいないときはrwロックを使用するのは素晴らしいことですが、この場合、ファイルから読み込むことはありません。ただログファイルなのでほとんど書き込みますので、WriteLocksを使用する必要がありますとにかく - >したがって、あなたは同時にリソースにアクセスすることはできません - >したがって、あなたは通常のロックを使用することができます。言及しておらず、両者はプロセス間同期のためには機能しません。 –

1

私はこれを行うためのCommand Patternのようなものを見てみます。並行書き込みは、データの完全性のための悪夢となります。

基本的には、このパターンを使用して、書き込みコマンドをキューに入れて、要求の順番通りに処理します。

書き込み中にファイルから読み取ることができるようにするには、ReaderWriterLockも使用する必要があります。コマンドパターンの背後にある第2の防御線であるため、特定の時間に1つのスレッドだけがファイルに書き込むことができます。

+0

+1はキューを使用することを推奨していますが、その後はRW-lockコメントのためにほとんどあなたを退治しました。キューはそれ自身のロックを管理しています...他に何をロックしていますか? –

+0

私はもう2番目の防衛のためにそれを意味しました。私はRWLを使うよりも良い方法があると思っていますが、RWLの性能低下にもかかわらず、早めに最適化することは嫌です。しかし、私は複数の異なるプロセス/アプリケーションがファイルにアクセスしてファイルに書き込むことを意味するのかどうか疑問に思っています。そうであれば、これらの両方が役に立たなくなります。 – joshlrogers

2

単純なデータベースの使用を検討してください。この組み込みの安全性はすべて比較的簡単に得られます。

2

プロセス間のアクセスを同期させる最速の方法は、Mutexes/Semaphoresを使用することです。私もあなたが良い解決策でクリティカルセクションにHERESに短い紙を複数のリーダーのみ1ライターを持っていることの例を探して推薦する Is there a global named reader/writer lock?

+0

複数のプロセスから参照できる名前付きのMutexを使用する方法があります。すべてのファイルアクセスが1つのプロセス(ただし複数のスレッド)からのものである場合、すべて同じミューテックスを指し示してロックを取得できます。 – Kieveli

+0

Kieveli - 著者はさまざまなプロセスを意味していたので、Mutexes/Semaphoersが最も明白な選択肢でした。私はそれらについて書きました。スレッドについて話し合うと、mutexとReadWriteLockのような単純な構造が機能します。 –

0

:このスレッドは、読み取り書き込みロックパターンをシミュレートするために、それらを使用する方法を答えますhttp://arxiv.org/PS_cache/cs/pdf/0303/0303005v1.pdf

また、要求されるたびにファイルのコピーを作成し、元のファイルとマージするファイルに変更を書き込むことができます。

関連する問題