FFileSystem := CreateFile(PChar(FFileName),
GENERIC_READ + GENERIC_WRITE,
FILE_SHARE_READ + FILE_SHARE_WRITE,
nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL OR
FILE_FLAG_RANDOM_ACCESS OR
FILE_ATTRIBUTE_TEMPORARY OR
FILE_FLAG_DELETE_ON_CLOSE,
0);
这是第二个开放:
FFileSystem2 := CreateFile(PChar(FFileName),
GENERIC_READ,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL OR
FILE_FLAG_RANDOM_ACCESS OR
FILE_ATTRIBUTE_TEMPORARY OR
FILE_FLAG_DELETE_ON_CLOSE,
0);
我已经尝试了各种标志的组合,但迄今为止都没有成功。第二个文件打开总是失败的,出现了一些消息表明该文件无法访问,因为它正在被另一个进程使用。
编辑:
好的,再提供一些信息(我希望不要在这里迷失方向...)
所涉及的进程是在WinXP 64上运行的Win32服务器进程。它正在维护大型空间数据库,并希望尽可能多地将空间数据库保存在L1/L2缓存结构中的内存中。 L1已经存在。 L2作为一个“临时”文件存在于Windows系统缓存中(这有点不正当,但可以在某种程度上避免Win32内存限制)。 Win64意味着我可以使用系统缓存中的大量内存,因此用于保存L2缓存的内存计入进程内存。
多个(潜在的许多)线程希望同时访问L2缓存中包含的信息。目前,访问是序列化的,这意味着一个线程可以读取其数据,而大多数(或其余)线程则被阻塞,等待该操作完成。
L2缓存文件确实会被写入,但我很高兴全局序列化/交错读和写类型操作,只要我可以执行并发读取即可。
我知道有令人讨厌的潜在线程并发问题,并且我知道在其他情况下有数十种解决方案。我有这个特定的上下文,并且我正在尝试确定是否有一种方法可以允许文件内和进程内的并发线程读取访问。
我考虑过的另一种方法是将L2缓存分成多个临时文件,其中每个文件都像当前单个L2缓存文件一样序列化线程访问。
是的,这种有点绝望的方法是因为64位Delphi不会很快与我们同在 :-(
LockFileEx
。然而,这种危险只限于您自己的程序;例如,您无需担心破坏文件系统。 - Rob Kennedy