TMemIniFile是线程安全的吗?

Rob*_*ank 4 delphi

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

我无法找到有关此错误的更多信息,这有助于了解正在发生的事情.

TMemIniFile是线程安全的吗?

Gui*_*ens 7

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

在这个链接中你可以找到一个线程安全的TCustomIniFile的实现(理论上由TeamB的Peter Below编程,虽然我不能保证).

还有约TMemIniFile的线程安全的英巴卡迪诺论坛的讨论在这里.他们谈论组件的C++版本.

您还可以找到在MSDN关于您的错误消息的来源的讨论在这里.它有点长,但一般的结论是有2个exes试图访问同一个文件.您可以在此处找到有关此主题的其他讨论.

  • 我怀疑你链接的线程安全的ini文件的内部锁定是这里的解决方案.听起来更像是有两个单独的`TMemIniFile`实例试图写入同一个磁盘文件.您链接的代码对此没有帮助.任何"X线程安全"问题的一个问题是术语"线程安全"有很多不同的含义. (2认同)
  • 但你的答案与症状不符.我知道它有很多upvotes和一个接受,但简单的事实是,如果所有方法的内部锁定是解决方案,症状将是访问违规. (2认同)

Dav*_*nan 5

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

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

AcquireLock;
Try
  ReadMemIniFileFromDisk;
  ModifyMemIniFileInMemory;
  WriteMemIniFileToDisk;
Finally
  ReleaseLock;    
End;
Run Code Online (Sandbox Code Playgroud)

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