我在我的应用程序中使用基于Boost
的{{1}}作为shared vector
。
在我试图读取共享内存的应用程序中,内存的大小m_size或IPC
在2之间保持波动(即向量的共享数量m&m; ),和0.我不知道为什么会这样。也许是同步问题?但即使是这种情况,内存的大小也不应该变为0,因为它只是读取内存中的任何内容。它可能无效(即旧数据),但不是0。
此外,写入共享存储器的应用程序重复输出2,作为共享存储器的大小...
可能是什么错误?
这会产生其他问题,因为我使用共享内存的大小来查看是否有任何内容写入其中。如果这不正确,我还可以使用其他参数吗?
请告知。
谢谢。
编辑:
写的申请:
创建
vector->size
现在正在写
shared_memory_object::remove("MySharedMemory"); // CREATION
m_bIsConnectionActive = false;
srvConnections = new PwServerCheckClass();
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
const ShmemAllocator alloc_inst (segment.get_segment_manager());
vector_to_send = segment.construct<VECTOR_TO_SEND>("VECTOR_TO_SEND")(alloc_inst);
申请表:
阅读:
m_vector_to_send = srvConnections->getServerList(); //Vector whose contents are to be copied into shared vector
for(UINT loopCounter = 0; loopCounter < m_vector_to_send.size(); loopCounter++)
{
SERVER_INFO_TYPE_CHAR TestSrv;
<Some code>
vector_to_send->push_back(TestSrv); //Pushing vector back into shared memory
wcout<<endl<<"Size of the vector is::"<<vector_to_send->size();
}
这是行为变得奇怪的地方。有时 managed_shared_memory segment(open_only, "MySharedMemory");
m_serverVector = segment.find<VECTOR_TO_SEND>("VECTOR_TO_SEND").first;
//int checkSrvSize = m_serverVector->shrink_to_fit;
if(m_serverVector == NULL)
return;
int SrvSizeCheck = 1;
do
{
if(!(m_serverVector->empty()))
continue;
for(auto it = m_serverVector->begin() ; it != m_serverVector->end() ; ++it, ++SrvSizeCheck)
<Some code>
会被满足,尽管有些东西被写入记忆中。有时它会超过vector->empty()
检查,而是在empty()
条件下失败。我不知道该怎么做。
编辑2
我看了一下文档。根据它,对于信号量部分,实际的互斥锁与共享内存相关联。所以创建了一个it != m_serverVector->end()
,里面有一个数组,还有一些sempahores。最终,这种结构在内存中共享。
就我而言,我在共享内存中共享一个向量。同样的原则是否有效,即我在其中创建一个带有向量的结构,以及互斥成员,并分享它?在这种情况下,要映射的结构,以及因此内存分配器,将是struct
的结构而不是Vector的结构,正如我在我的代码中所做的那样,对吗?
请告知。
答案 0 :(得分:1)
是的,您似乎没有任何锁定。
在进程之间共享内存可能会导致并发突变/访问。为此你需要锁定。否则,您将引入数据竞争,并根据c ++标准调用Undefined Behaviour。
事实上 - 在大多数现实情况下,您实际上需要一个互斥锁来锁定共享内存区域的创建(除非您可以证明创建是单线程的)。
看看
如果需要,可以使用信号量来生成带有“消息就绪”通知的有效消息队列。见BIP Semaphore
最后,如果您使用专为此设计的无锁容器,可以使用无锁访问,例如Shared-memory IPC synchronization (lock-free)