TMemIniFile是线程安全的吗?

时间:2011-05-09 17:15:25

标签: delphi

用户收到间歇性错误“无法创建文件”C:... \ Filename.ini“。无法对打开了用户映射部分的文件执行请求的操作。”

我无法找到有助于了解正在发生的事情的错误。

TMemIniFile是线程安全的吗?

3 个答案:

答案 0 :(得分:7)

据我所知,TMemIniFile(和任何其他TCustomIniFile后代)不是线程安全的。您需要将其包装到关键部分。

在这个link中,你可以找到一个线程安全的TCustomIniFile的实现(理论上由Peter TeamB编写,虽然我无法保证它。)

Embarcadero论坛上还讨论了TMemIniFile here的线程安全问题。他们谈论组件的C ++版本。

您还可以在MSDN中找到有关错误消息来源here的讨论。它有点长,但一般的结论是有2个exes试图访问同一个文件。您可以找到有关该主题的另一个讨论here

答案 1 :(得分:5)

首先,我假设导致报告问题的特定线程配置是有多个TMemIniFile实例,甚至可能在不同的进程中,同时从不同的线程保存。

TMemIniFile不是线程安全的。为了避免任何竞争条件,您需要编写(伪)代码,如下所示:

AcquireLock;
Try
  ReadMemIniFileFromDisk;
  ModifyMemIniFileInMemory;
  WriteMemIniFileToDisk;
Finally
  ReleaseLock;    
End;

仅锁定文件操作是不够的,因为那样你可能会因为比赛而失去更改。您必须锁定整个读/修改/写入周期。

答案 2 :(得分:0)

<强>解决方案

此错误消息是由AVG中的错误引起的。 AVG显然在其实时文件访问监控模式下,以独占模式打开一些文件,防止其他人写入文件。

修复方法是将AVG配置为忽略此文件所在的文件夹。

谢谢,AVG!我现在可以浪费2天的时间吗? : - )

感谢所有在此回答的人。

汤姆