VirtualFree是否解锁VirtualLock ?
Does VirtualFree unlock VirtualLock?
我正在重写相当旧的c++代码,并在内存管理部分绊倒了。
更具体地说,"所需"内存首先以类似于 的方式分配。int* Buffer;
int numPoints=80000;
Buffer = (int*)VirtualAlloc(NULL, numPoints* sizeof(int), MEM_COMMIT, PAGE_READWRITE);
VirtualLock(Buffer,numPoints * sizeof(int));
但是,只有VirtualFree
释放了Buffer,而VirtualUnlock
没有。
所以,第一个问题: VirtualFree调用VirtualUnlock吗?
此外,我读了一些关于VirtualLock
。在我的代码中,它显然是用于提高性能,因为很多非常大的数组被使用和访问非常频繁,部分甚至被绘制为2 fps左右的图形…然而,我读到1。Virtuallock会降低系统性能,最终会再次减慢系统运行速度。对于大缓冲区,Virtuallock并没有真正提高性能。后一种说法在这里用株HBC (https://software.intel.com/de-de/forums/intel-threading-building-blocks/topic/276995)进行了测试。
因此,结论是我将决定不使用VirtualLock
,但是https://msdn.microsoft.com/de-de/library/windows/desktop/aa366895(v=vs.85).aspx声明VirtualLock
是确保对该区域的后续访问不会导致页面错误。这是否意味着,注释掉VirtualLock
将使访问像*(buffer+10)=1
一样失败或产生页面错误(假设缓冲区有超过11个已分配的点)?
所以第二个问题是:我可以安全地放弃锁定内存而不把数组访问页面错误或崩溃的危险?
是的。VirtualFree(MEM_RELEASE/MEM_DECOMMIT)将被VirtualLock()锁定的区域解除锁定。
和VirtualLock()仍然是有用的,因为它使更快的访问。(此外,有些任务需要非分页内存,比如重叠的IO。)如果没有VirtualLock(),无论物理内存大小如何,都不能保证超过数百兆字节的缓冲区是非分页的,因为操作系统倾向于为内核的非分页池保留物理内存&IO缓存。
顺便说一下,你需要SetProcessWorkingSetSize()来为你自己的进程保护物理内存。如果没有足够的进程工作集,VirtualLock()可能会失败。 对于通用软件(运行在各种未知系统内存大小的系统上)来说,锁定巨大的内存区域并不是一个好主意,因为它从操作系统的关键部分窃取了物理内存将它用于在专用机器上运行的软件(如专用服务器或专用编码PC)。- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在Qt 5.4中可以对互斥对象进行两次解锁吗
- VirtualFree是否解锁VirtualLock ?