6

对于需要将内存页面锁定到物理内存中的实时 C++ 应用程序,我在 boost 中弄乱了共享内存对象。我没有看到在提升中做到这一点的方法。我觉得我错过了一些东西,因为我知道 Windows 和 Linux 都有办法做到这一点(mlock()VirtualLock())。

4

1 回答 1

4

根据我的经验,最好编写一个为此提供必要功能的小型跨平台库。当然,内部会有一些#ifdef-s。

像这样的东西(假设GetPageSizeAlign*已经实现):

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 回答