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 に答える