2009-07-21 78 views
7

如何寫入可由多個源訪問的文本文件(可能以併發方式)確保沒有寫操作丟失?並行文件寫入

就像,如果兩個不同的進程在同一時刻寫入文件,這可能會導致問題。簡單解決方案(不是非常快速且不太優雅)將在開始進程時鎖定文件(創建.lock文件或類似文件),並在寫入完成時釋放它(刪除鎖)。

當開始寫入時,我會檢查.lock文件是否存在,並延遲寫入,直到文件被釋放。

這種情況下推薦的模式是什麼?

感謝

編輯 我的意思是過程,就像從不同的客戶,不同的用戶等等,同樣的程序

+0

你的意思是兩個不同的進程或線程?因爲如果你想在少數進程中安全地訪問一個文件,沒有使用一些Mutex或其他進程間鎖定機制,你就無能爲力了。 – 2009-07-21 16:25:39

回答

1

內沒有線程我建議使用ReaderWriterLock不同的程序。它專爲多個閱讀器設計,但確保只有一個寫入者可以在任何時間編寫數據MSDN

+2

不要使用ReaderWriterLock,它的性能很差。在Wintellect PowerThreading庫中使用ReaderWriterLockSlim或Jeffrey Richter的鎖之一。 – 2009-07-21 16:31:57

+1

不要使用;)。 ReadWriter鎖,監視器(鎖)等沒有能力進程間鎖,這是作者的意思,我認爲(就像,如果兩個不同的進程在同一時刻寫入文件)? – 2009-07-21 16:35:03

+1

請勿使用進程間鎖定。切換到一次只運行一個進程的OS。 – Kieveli 2009-07-21 17:18:14

0

你也可以嘗試鎖定。這很容易 - 「鎖可以確保一個線程不會進入關鍵部分,而另一個線程處於代碼的關鍵部分,如果另一個線程嘗試輸入一個鎖定代碼,它將等待(阻止),直到該對象被釋放。

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

1

我想看看類似的Command Pattern這樣做。併發寫作對數據完整性來說是一場噩夢。

本質上,你使用這種模式排隊你的寫命令,以便他們按請求的順序完成。

您還應該使用ReaderWriterLock以確保在寫入時可以從文件讀取數據。這將是命令模式背後的第二道防線,以便在給定時間只有一個線程可以寫入文件。

2

考慮使用簡單的數據庫。您將獲得所有這些內置安全性相對容易。

0

我也建議你找有多個讀者僅1作家中的一個關鍵部分有很好的解決方案繼承人短紙的例子http://arxiv.org/PS_cache/cs/pdf/0303/0303005v1.pdf

或者,您可以查看每次請求時創建文件的副本,以及何時需要將文件的任何更改寫入與原始文件合併的文件。