簡體   English   中英

用於進程間共享內存的非 Boost STL 分配器?

[英]Non-Boost STL allocator for inter-process shared memory?

由於我工作的政策,我無法使用高於 1.33.1 的 Boost 版本,也無法使用高於 4.1.2 的 GCC 版本。 是的,這是垃圾,但我無能為力。 Boost 1.33.1 不包含進程間庫。

也就是說,我的一個項目需要將std::map (或更可能是std::unordered_map )放入共享內存中。 當進程由單個進程(“服務器”)加載並由許多其他進程讀取時,它僅被寫入/修改一次。 我以前沒有做過共享內存 IPC,所以這對我來說是相當新的領域。 我查看了shmget()但似乎我不能連續使用相同的共享內存鍵進行分配(因為我認為 STL 容器分配器需要)。

是否有其他使用共享內存的非 BOOST STL 分配器?

編輯:之前已經完成。 Dobbs 博士早在 2003 年就有一篇關於如何做到這一點的文章,我開始將其用作參考。 但是,代碼清單不完整,指向它們的鏈接重定向到主站點。

編輯 編輯:我不只是重寫 Boost.Interprocess 的唯一原因是因為涉及的代碼量。 我只是想知道是否有專門針對 POSIX 共享內存的相對簡短和簡潔的內容,我可以從頭開始重寫,因為網絡之間的數據傳輸也需要經過多天的批准過程......

指針在共享內存中不起作用,除非您無法將共享內存固定在固定地址(在所有進程中一致)。 因此,您需要特定的類,這些類要么是連續的(沒有指針),要么在共享內存所映射的內存區域中有一個偏移量(而不是指針)。

我們在工作中使用共享內存的情況非常相似:一個進程計算一組數據,將其放置在共享內存中,然后通知其他進程他們可以將內存映射到自己的地址空間; 之后記憶永遠不會改變。

我們采用的方法是使用POD結構 (*)(有些包括char xxx[N];用於字符串存儲的屬性)。 如果你真的可以限制你的字符串,你就是金子。 map而言:只讀存儲效率低下 => 排序數組性能更好(為​​內存局部性歡呼)。 所以我建議這樣做:

struct Key {
    enum { Size = 318 };
    char value[Size];
};

struct Value {
    enum { Size = 412 };
    enum K { Int, Long, String };
    K kind;
    union { int i; long l; char string[Size]; } value;
};

然后只需有一個std::pair<Key, Value>數組,您可以對其進行排序( std::sort ),並使用std::lower_bound進行搜索。 顯然,您需要為鍵編寫一個比較運算符:

bool operator<(Key const& left, Key const& right) {
    return memcmp(left.value, right.value, Key::Size) < 0;
}

我同意 enum + union 技巧比 boost 變體更不吸引人(界面明智)……讓界面變得更好取決於你。

(*) 實際上,不需要純 POD。 例如,擁有私有屬性、構造函數和復制構造函數是完全可以的。 所需要的只是避免間接(指針)。

簡單的解決方法。 從 Boost 1.51 創建你自己的“libNotBoost v1.0`。Boost 庫允許這樣做。因為它不再是 Boost,所以你沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM