我需要与多个线程同时访问一个文件.这需要同时完成,不出于性能原因而没有线程序列化.
特别是文件是使用'临时'文件属性创建的,该属性鼓励窗口将文件保存在系统缓存中.这意味着文件读取的大部分时间不会靠近磁盘,但会从系统缓存中读取文件的一部分.
能够同时访问此文件将显着提高我的代码中某些算法的性能.
所以,这里有两个问题:
这是创造:
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);
Run Code Online (Sandbox Code Playgroud)
这是第二次开放:
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);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试过各种标志组合,但没有成功.打开的第二个文件总是失败,并且消息表明该文件在被另一个进程使用时无法访问.
编辑:
好的,还有更多的信息(我希望不要迷失在这里的杂草......)
有问题的过程是在WinXP 64上运行的Win32服务器进程.它维护大型空间数据库,并希望在L1/L2缓存结构的内存中保留尽可能多的空间数据库.L1已经存在.L2作为一个"临时"文件存在,它保留在Windows系统缓存中(这有点像一个肮脏的技巧,但在某种程度上绕过win32内存限制).Win64意味着我可以拥有系统缓存使用的大量内存,因此用于保存L2缓存的内存确实会计入进程内存.
多个(可能很多)线程希望同时访问L2缓存中包含的信息.目前,访问是序列化的,这意味着一个线程可以读取它的数据,而大多数(或其余的)线程被阻塞,等待该操作完成.
L2高速缓存文件确实被写入,但我很乐意全局序列化/交错读写类型操作,只要我可以执行并发读取.
我知道存在令人讨厌的潜在线程并发问题,而且我知道有很多方法可以在其他环境中对这只猫进行修饰.我有这个特定的上下文,我正在尝试确定是否有一种方法允许在文件内和同一进程内进行并发线程读取访问.
我考虑的另一种方法是将L2缓存拆分为多个临时文件,其中每个文件以当前单个L2缓存文件的方式串行化线程访问.
是的,这种有点绝望的方法是因为64位Delphi不会很快与我们在一起:-(
谢谢,雷蒙德.
我在将问题安装Delphi 2007 RAD Studio Professional到Windows 7 64位企业版上时遇到问题.
一切都很好,直到我输入安装的序列号.输入并单击安装向导中的下一个按钮后,我在第906行收到安装脚本错误.确定该错误会关闭安装程序.
我已经做了一些谷歌搜索,但还没有发现任何类似的东西(虽然我已经找到很多引用,已经在各种版本的64位窗口上安装了它,并有其他问题的人).
我已经能够在同一台机器上安装Delphi 2009而没有任何问题.
我真的很想安装2007,因为这是我们目前的主要Delphi开发IDE.