我知道boost interprocess containers,並且這些示例使用託管共享內存。但我想用一個簡單的boost::interprocess::shared_memory_object
,裏面有一個對象,以及一個矢量或該對象內的任何其他容器。這似乎並不奏效。將矢量或任何其他容器存儲在boost進程shared_memory_object中?
試過這樣:
#include <stack>
#include <boost/interprocess/containers/vector.hpp>
namespace bip = boost::interprocess;
class SharedMemoryMetadata
{
public:
std::stack<unsigned short> newData;
int deleteme;
bip::vector<unsigned short> v;
};
,並創建共享內存:
bip::shared_memory_object::remove(OUTPUT_METADATA_MEMORY_SEGMENT_NAME);
sharedMemoryMetadataForOutput = new bip::shared_memory_object(bip::create_only, OUTPUT_METADATA_MEMORY_SEGMENT_NAME, bip::read_write);//use old shared memory if exists else create a new one
sharedMemoryMetadataForOutput->truncate(sizeof(SharedMemoryMetadata)+ (3*sizeof(unsigned int)*MAX_NUMBER_OF_OBJECTS_EXPECTED_TO_BE_IN_SHARED_MEMORY));//set the size of the memory object
sharedMemoryMetadataRegion = new bip::mapped_region(*sharedMemoryMetadataForOutput, bip::read_write);//map the whole shared memory in this process
void* sharedMemorySegmentForMetadataStorage = sharedMemoryMetadataRegion->get_address();//get the region address
sharedMemoryMetadataObject = new (sharedMemorySegmentForMetadataStorage) SharedMemoryMetadata();//create a shared memory buffer in memory
,我嘗試訪問它:
bip::shared_memory_object* sharedMemoryMetadataForOutput;
SharedMemoryMetadata* sharedMemoryMetadataObject;
bip::mapped_region* sharedMemoryMetadataRegion;
bip::shared_memory_object* sharedMemoryMetadataForOutput;
SharedMemoryMetadata* sharedMemoryMetadataObject;
bip::mapped_region* sharedMemoryMetadataRegion;
sharedMemoryMetadataForOutput = new bip::shared_memory_object(bip::open_only, OUTPUT_METADATA_MEMORY_SEGMENT_NAME, bip::read_write);//create a shared memory object http://blog.wolfgang-vogl.com/?p=528
sharedMemoryMetadataRegion = new bip::mapped_region(*sharedMemoryMetadataForOutput, bip::read_write);//Map the whole shared memory in this process
void * sharedMemorySegmentForMetadataStorage = sharedMemoryMetadataRegion->get_address();//get the region address
sharedMemoryMetadataObject = static_cast<SharedMemoryMetadata*>(sharedMemorySegmentForMetadataStorage);//Obtain the shared structure
如預期,std::stack<unsigned short> newData;
真可謂即使有東西寫入堆棧,也是空的。但是如果我給int deleteme
賦值,我可以從另一個訪問共享內存的程序中讀取它。
push_back
到bip::vector<unsigned short> v;
有效,但是當我嘗試從其他程序訪問它時,出現分段錯誤。有沒有一種方法可以在shared_memory_object
中存儲和訪問矢量,或者只能使用託管共享內存?即使我使用託管共享內存,我如何將向量存儲在SharedMemoryMetadata
類中,如上所示?
謝謝。我已經意識到分配的概念。我希望得到的是一個解決方案或一個工作代碼。如果沒有簡單的解決方案,我會繼續並刪除我的問題。 – Nav