以下代码是否会将数据从文件加载到系统内存中,以便访问生成的指针永远不会阻塞线程?
auto ptr = VirtualLock(MapViewOfFile(file_map, FILE_MAP_READ, high, low, size), size); // Map file to memory and wait for DMA transfer to finish.
int val0 = reinterpret_cast<int*>(ptr)[0]; // Will not block thread?
int val1 = reinterpret_cast<int*>(ptr)[size-4]; // Will not block thread?
VirtualUnlock(ptr);
UnmapViewOfFile(ptr);
编辑:
在达蒙斯回答后更新。
auto ptr = MapViewOfFile(file_map, FILE_MAP_READ, high, low, size);
#pragma optimize("", off)
char dummy;
for(int n = 0; n < size; n += 4096)
dummy = reinterpret_cast<char*>(ptr)[n];
#pragma optimize("", on)
int val0 = reinterpret_cast<int*>(ptr)[0]; // Will not block thread?
int val1 = reinterpret_cast<int*>(ptr)[size-4]; // Will not block thread?
UnmapViewOfFile(ptr);
答案 0 :(得分:2)
如果文件的大小小于极小的最大工作集大小(或者,如果您相应地修改了工作集大小),那么理论上是。如果超过最大工作集大小,VirtualLock
将不执行任何操作(即失败)。
(实际上,我已经看到VirtualLock
相当......自由......在解释它应该做的事情而不是它实际上做什么,至少在Windows XP下 - 可能会有所不同在更现代的版本下)
我过去一直在尝试类似的事情,现在我只是简单地用简单的for
循环(读取一个字节)触摸我想要的所有页面。这没有任何问题可以打开并且有效,唯一可能的例外是理论上的页面可能在触摸后再次被换出。在实践中,这种情况从未发生过(除非机器真的非常低,然后才能发生)。