gpt4 book ai didi

c++ - MapViewOfFile 和 VirtualLock

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:31 28 4
gpt4 key购买 nike

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

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

编辑:

在 Dammons 回答后更新。

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com