2014-02-06 102 views
1

我已經創建了一個Boost共享內存,用於共享向量。從Boost InterProcess共享內存中檢索共享向量

共享已完成。

但是,我不明白向量如何被推入共享內存。

我做了push_back到寫入過程的共享內存。因此,這些載體正在被按入堆棧push以LIFO順序進入共享內存?現在,這裏

managed_shared_nmemory segment (open_only, "Shared_mem_name"); 
Vector = segment.find<VECTOR_TYPE>("Vector_name").first; 

if (Vector != NULL) 
{ 
    //CODDE 
} 

,我在讀的載體:

其他應用程序,讀卡器,檢索矢量在下面的流行時尚。推入最後一個(最新的)?如果我正在閱讀它,這是否意味着矢量彈出?即在讀取後它是否仍然存在於共享內存中,如果是這樣,共享內存會在一段時間後溢出,我將如何阻止它?我沒有看到有關它的文檔中的任何內容......

+0

檢查是否有適當的進程同步**和**正在'VECTOR_TYPE'中使用IPC分配器。我建議你從文檔中的示例開始。 – sehe

回答

1

矢量未被「推入」共享內存。沒有隱式堆棧。

而是,向量在共享存儲器中生活。你正在閱讀的內容實際上與另一個進程中的矢量完全相同,即在同一時間

請注意,這強烈暗示着您需要一個共享互斥體來同步訪問,否則您將在線程之間(來自不同進程)之間進行數據競爭,根據定義,這是C++中的Undefined Behaviour


在一個稍微不同的角度:

我做push_back從寫入處理的共享存儲器。那麼這些載體就像是按照LIFO的順序推入共享內存?

其分解:

  • 我做了push_back共享內存

    不,你不會。您push矢量元素到一個矢量的back。這個載體是您共享單一的東西,名字"Vector_name"

  • 所以向量被推

    沒有下,你的載體呆在原地:共享內存。

  • 就像一個堆棧推入共享內存,按照LIFO的順序?

    沒有,有隻有1向量。矢量本身就是一個有序的順序容器。它支持隨機訪問,所以

    for (auto it = v.begin(); it!= v.end(); ++it) 
    { // process `*it` in order 
    } 
    

    VS

    for (auto it = v.rbegin(); it!= v.rend(); ++it) 
    { // process `*it` in reversed order 
    } 
    

    如果你總是使用push_back插入,然後in order迭代就像是 「先進先出」

+0

因此,在這種情況下,如果我讀了一條記錄'Vector = segment.find (「Vector_name」)。第一個',我實際上是在讀第一個寫在它上面的記錄嗎?共享內存被填充時的行爲是什麼?它是否從第一個開始覆蓋? – user1173240

+0

不可以。一如往常,如果allocator內存不足,你會得到'std :: bad_alloc'異常? – sehe

+1

@ user1173240 PS。如果你想**這種行爲,看看boost :: circular_buffer例如http://www.boost.org/doc/libs/1_55_0/doc/html/circular_buffer.html – sehe