对于需要将内存页面锁定到物理内存中的实时 C++ 应用程序,我在 boost 中弄乱了共享内存对象。我没有看到在提升中做到这一点的方法。我觉得我错过了一些东西,因为我知道 Windows 和 Linux 都有办法做到这一点(mlock()
和VirtualLock()
)。
问问题
881 次
1 回答
4
根据我的经验,最好编写一个为此提供必要功能的小型跨平台库。当然,内部会有一些#ifdef-s。
像这样的东西(假设GetPageSize
并Align*
已经实现):
void LockMemory(void* addr, size_t len) {
#if defined(_unix_)
const size_t pageSize = GetPageSize();
if (mlock(AlignDown(addr, pageSize), AlignUp(len, pageSize)))
throw std::exception(LastSystemErrorText());
#elif defined(_win_)
HANDLE hndl = GetCurrentProcess();
size_t min, max;
if (!GetProcessWorkingSetSize(hndl, &min, &max))
throw std::exception(LastSystemErrorText());
if (!SetProcessWorkingSetSize(hndl, min + len, max + len))
throw std::exception(LastSystemErrorText());
if (!VirtualLock(addr, len))
throw std::exception(LastSystemErrorText());
#endif
}
我们也尝试使用一些 boost:: 库,但厌倦了修复跨平台问题并切换到我们自己的实现。写起来比较慢,但是可以。
于 2013-11-17T12:56:23.003 回答