考虑一个在 Windows XP 上运行在 32 位地址空间内的复杂的、需要大量内存的多线程应用程序。
某些操作需要 n 个固定大小的大缓冲区,其中一次只需要访问一个缓冲区。
应用程序使用一种模式,其中一个缓冲区大小的一些地址空间被提前保留,并用于包含当前需要的缓冲区。
这遵循以下顺序:(初始运行)VirtualAlloc -> VirtualFree -> MapViewOfFileEx(缓冲区更改)UnMapViewOfFile -> MapViewOfFileEx
这里指向缓冲区位置的指针是通过调用 VirtualAlloc 提供的,然后在每次调用 MapViewOfFileEx 时使用相同的位置。
问题是windows(据我所知)不提供任何握手类型的操作来传递不同用户之间的内存空间。
因此,有一个小机会(在我上面的序列中的每个 -> 处)内存未锁定,另一个线程可以跳入并在缓冲区内执行分配。
对 MapViewOfFileEx 的下一次调用被中断,系统无法再保证地址空间中有足够大的空间用于缓冲区。
显然,重构以使用更小的缓冲区会降低重新分配空间的失败率。
HeapLock 的一些使用取得了一些成功,但这仍然存在问题 - 某些东西仍然设法从地址空间中窃取一些内存。(我们尝试调用 GetProcessHeaps 然后使用 HeapLock 锁定所有堆)
我想知道是否有锁定与 MapViewOfFileEx 兼容的特定地址空间块?
编辑:我应该补充一点,最终这段代码存在于一个库中,该库被我无法控制的应用程序调用