以下代码是否会将文件中的数据加载到系统内存中,以便对结果指针的访问永远不会阻塞线程?

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);

最佳答案

如果文件的大小小于可笑的最大工作集大小(或者,如果您已经相应地修改了工作集大小),则理论上可以。如果超出最大工作集大小,则VirtualLock将完全不执行任何操作(即失败)。

(在实践中,我已经看到VirtualLock相当...自由...解释其应做的事情而不是实际做的事情,至少在Windows XP中如此-在更现代的版本中可能有所不同)

过去,我一直在尝试类似的事情,而现在,我只是通过一个简单的for循环(读取一个字节)来触摸我想要在RAM中的所有页面。这没有任何问题可以解决并且可以正常工作,唯一可能的异常(exception)是理论上页面在被触摸后可能会再次换出。在实践中,这永远不会发生(除非机器的RAM确实非常低,然后可以实现)。

关于c++ - MapViewOfFile和VirtualLock,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11968898/

10-10 17:49