我正在使用boost中的共享内存对象,因为需要将内存页锁定到物理内存中的实时C ++应用程序。在增强中我没有看到这样做的方法。我觉得我错过了一些东西,因为我知道Windows和Linux都有办法做到这一点(mlock()
和VirtualLock()
)。
答案 0 :(得分:3)
根据我的经验,最好编写一个小型跨平台库,为此提供必要的功能。当然,在内部会有一些#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 :: libraries,但是他们已经厌倦了修复跨平台问题并转而使用我们自己的实现。它写得慢,但它有效。