如何寫入可由多個源訪問的文本文件(可能以併發方式)確保沒有寫操作丟失?並行文件寫入
就像,如果兩個不同的進程在同一時刻寫入文件,這可能會導致問題。簡單解決方案(不是非常快速且不太優雅)將在開始進程時鎖定文件(創建.lock文件或類似文件),並在寫入完成時釋放它(刪除鎖)。
當開始寫入時,我會檢查.lock文件是否存在,並延遲寫入,直到文件被釋放。
這種情況下推薦的模式是什麼?
感謝
編輯 我的意思是過程,就像從不同的客戶,不同的用戶等等,同樣的程序
如何寫入可由多個源訪問的文本文件(可能以併發方式)確保沒有寫操作丟失?並行文件寫入
就像,如果兩個不同的進程在同一時刻寫入文件,這可能會導致問題。簡單解決方案(不是非常快速且不太優雅)將在開始進程時鎖定文件(創建.lock文件或類似文件),並在寫入完成時釋放它(刪除鎖)。
當開始寫入時,我會檢查.lock文件是否存在,並延遲寫入,直到文件被釋放。
這種情況下推薦的模式是什麼?
感謝
編輯 我的意思是過程,就像從不同的客戶,不同的用戶等等,同樣的程序
內沒有線程我建議使用ReaderWriterLock不同的程序。它專爲多個閱讀器設計,但確保只有一個寫入者可以在任何時間編寫數據MSDN。
不要使用ReaderWriterLock,它的性能很差。在Wintellect PowerThreading庫中使用ReaderWriterLockSlim或Jeffrey Richter的鎖之一。 – 2009-07-21 16:31:57
不要使用;)。 ReadWriter鎖,監視器(鎖)等沒有能力進程間鎖,這是作者的意思,我認爲(就像,如果兩個不同的進程在同一時刻寫入文件)? – 2009-07-21 16:35:03
請勿使用進程間鎖定。切換到一次只運行一個進程的OS。 – Kieveli 2009-07-21 17:18:14
你也可以嘗試鎖定。這很容易 - 「鎖可以確保一個線程不會進入關鍵部分,而另一個線程處於代碼的關鍵部分,如果另一個線程嘗試輸入一個鎖定代碼,它將等待(阻止),直到該對象被釋放。
http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.71%29.aspx
我想看看類似的Command Pattern這樣做。併發寫作對數據完整性來說是一場噩夢。
本質上,你使用這種模式排隊你的寫命令,以便他們按請求的順序完成。
您還應該使用ReaderWriterLock以確保在寫入時可以從文件讀取數據。這將是命令模式背後的第二道防線,以便在給定時間只有一個線程可以寫入文件。
考慮使用簡單的數據庫。您將獲得所有這些內置安全性相對容易。
進程之間同步訪問的最快方式是使用互斥鎖/信號量。這線程回答如何使用它們,來模擬讀寫器鎖模式: Is there a global named reader/writer lock?
我也建議你找有多個讀者僅1作家中的一個關鍵部分有很好的解決方案繼承人短紙的例子http://arxiv.org/PS_cache/cs/pdf/0303/0303005v1.pdf
或者,您可以查看每次請求時創建文件的副本,以及何時需要將文件的任何更改寫入與原始文件合併的文件。
你的意思是兩個不同的進程或線程?因爲如果你想在少數進程中安全地訪問一個文件,沒有使用一些Mutex或其他進程間鎖定機制,你就無能爲力了。 – 2009-07-21 16:25:39