2015-02-11 36 views
0

我在提升IPC(進程間通信)提高IPC new和delete操作

#include <boost/interprocess/shared_memory_object.hpp> 
#include <boost/interprocess/mapped_region.hpp> 
#include <boost/interprocess/sync/scoped_lock.hpp> 
#include <iostream> 
#include <cstdio> 
#include "doc_anonymous_condition_shared_data.hpp" 

using namespace boost::interprocess; 

int main() 
{ 

    //Erase previous shared memory and schedule erasure on exit 
    struct shm_remove 
    { 
     shm_remove() { shared_memory_object::remove("MySharedMemory"); } 
     ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); } 
    } remover; 

    //Create a shared memory object. 
    shared_memory_object shm 
     (create_only    //only create 
     ,"MySharedMemory"   //name 
     ,read_write    //read-write mode 
    ); 
    try{ 
     //Set size 
     shm.truncate(sizeof(trace_queue)); 

     //Map the whole shared memory in this process 
     mapped_region region 
     (shm      //What to map 
     ,read_write //Map it as read-write 
     ); 

     //Get the address of the mapped region 
     void * addr  = region.get_address(); 

     //Construct the shared structure in memory 
     trace_queue * data = new (addr) trace_queue; 

     const int NumMsg = 100; 

     for(int i = 0; i < NumMsg; ++i){ 
     scoped_lock<interprocess_mutex> lock(data->mutex); 
     if(data->message_in){ 
      data->cond_full.wait(lock); 
     } 
     if(i == (NumMsg-1)) 
      std::sprintf(data->items, "%s", "last message"); 
     else 
      std::sprintf(data->items, "%s_%d", "my_trace", i); 

     //Notify to the other process that there is a message 
     data->cond_empty.notify_one(); 

     //Mark message buffer as full 
     data->message_in = true; 
     } 
    } 
    catch(interprocess_exception &ex){ 
     std::cout << ex.what() << std::endl; 
     return 1; 
    } 

    return 0; 
} 

沒有delete運營商的例子中看到的example。可能在存儲器區域中使用的新操作員,不能與delete操作員一起使用。如果我需要調用析構函數,我應該直接調用:

data->~trace_queue(); 

我對不對?

+3

是的你是對的。您使用的放置新內容實際上並未分配「刪除」可以釋放的內存。 – 2015-02-11 13:04:04

回答

1

是的,你說得對Joachim評論。

但是,我建議使用managed_shared_memory其中有find<T>,find_or_construct<T>construct<T>使您的生活更輕鬆。

如果您需要存儲許多相同類型的對象,請考慮使用該類型的std::vector(或boost::container::vector),並使用boost::interprocess::allocator