用戶正在收到間歇性錯誤「無法創建文件」C:... \ Filename.ini「。請求的操作無法在打開了用戶映射部分的文件上執行。TMemIniFile線程安全嗎?
我一直無法找到有關這個錯誤的信息,這有助於理解發生了什麼。
是TMemIniFile線程安全的嗎?
用戶正在收到間歇性錯誤「無法創建文件」C:... \ Filename.ini「。請求的操作無法在打開了用戶映射部分的文件上執行。TMemIniFile線程安全嗎?
我一直無法找到有關這個錯誤的信息,這有助於理解發生了什麼。
是TMemIniFile線程安全的嗎?
首先,我假設導致問題的特定線程配置報告是存在多個TMemIniFile
實例,甚至可能在不同進程中同時從不同線程保存。
TMemIniFile
不是線程安全的。爲避免你需要寫(僞)代碼的任何像這樣的比賽條件:
AcquireLock;
Try
ReadMemIniFileFromDisk;
ModifyMemIniFileInMemory;
WriteMemIniFileToDisk;
Finally
ReleaseLock;
End;
這是不夠的鎖定周圍就在文件操作,因爲你可能會失去,由於競爭的變化。您必須鎖定整個讀/修改/寫週期。
您也可以在進行任何訪問之前進入關鍵部分,並在任何單個呼叫或一組呼叫後退出關鍵部分 - 當一次只有一個線程可以訪問它時,您不必擔心競賽。根據定義,一場比賽涉及兩個線程在同一時間對一個對象進行操作。 – 2011-05-09 23:06:41
@warren這裏的問題似乎是TMemIniFile有兩個寫入單個文件的實例。內部鎖定不會有任何好處。 – 2011-05-10 06:26:15
哎。然後那個人感到困惑。我明白你想告訴他們什麼。但我認爲最好是更改代碼,以便它們不會爲相同的物理資源實例化兩個類包裝,然後用關鍵部分來保護該單個實例,而不是保留它們的破壞設計,並將整個週期與全球鎖定。 – 2011-05-10 13:40:43
解
此錯誤消息是由一個AVG錯誤引起的。顯然,在實時文件訪問監控模式下,AVG以獨佔模式打開一些文件,防止他人寫入文件。
解決的辦法是將AVG配置爲忽略此文件所在的文件夾。
謝謝,AVG!現在可以讓我浪費2天的時間嗎? :-)
感謝大家誰在這裏回答。
Tom
所以它是反病毒! – 2011-05-11 21:07:26
我很懷疑鏈接的線程安全ini文件的內部鎖定是解決方案。這聽起來更像是有兩個單獨的'TMemIniFile'實例試圖寫入同一個磁盤文件。你鏈接的代碼對此沒有幫助。任何「X線程安全」問題中的一個問題是,術語「線程安全」有很多不同的含義。 – 2011-05-09 20:32:02
@David,你可能對單獨的TMemIniFile實例是正確的。正如你所說的,問題在於它可能是任何東西:2個exes,2個線程,2個實例在同一個線程中,等等。由於OP沒有指定這個信息,我添加了這個鏈接以防萬一它可以幫助他。 :) – 2011-05-10 06:05:36
但您的答案不符合症狀。我知道它有很多upvotes和一個接受,但簡單的事實是,如果所有方法的內部鎖定是解決方案,症狀將是訪問衝突。 – 2011-05-10 06:50:36