我在我的应用程序中使用基于Boost
的共享 vector
作为IPC
。
在我尝试读取共享内存的应用程序中,内存的大小 m_size 或 vector->size
一直在 2 之间波动(即我的 vector 数量m 共享 ) 和 0。我不知道为什么会这样。也许这是一个同步问题?但即使是这样,内存的大小也不应该为 0,因为它只是读取内存中的任何内容。它可能无效(即旧数据),但不是 0。
另外,重复写入共享内存的应用程序输出2,作为共享内存的大小...
可能是什么错误?
这会产生额外的问题,因为我正在使用共享内存的大小来查看其中是否写入了任何内容。如果那不正确,我还可以使用什么其他参数?
请指教。
谢谢。
编辑:
写入的应用程序:
创作
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()
检查并在 it != m_serverVector->end()
条件下失败。我不知道该怎么做。
编辑 2
我看了看文档。根据它,对于信号量部分,实际的互斥锁与共享内存相关联。所以创建了一个struct
,里面有一个数组,还有一些信号量。最终在内存中共享的是这个结构。
在我的例子中,我在共享内存中共享一个 vector 。同样的原理是否可行,即我创建一个内部有 vector 的结构,以及互斥锁成员,并共享它?在这种情况下,要映射的结构以及内存分配器将是 struct
的结构,而不是 Vector 的结构,正如我在我的代码中所做的那样,对吗?
请指教。
最佳答案
是的,您似乎没有任何锁定。
在进程之间共享内存存在并发突变/访问的风险。为此,您需要锁定。否则,您会引入数据竞争,这会调用 Undefined Behaviour按照 C++ 标准。
事实上 - 在大多数现实生活中,您实际上需要一个互斥锁来锁定共享内存区域的创建(除非您可以证明该创建是单线程的)。
看看
- 命名的互斥锁 ( http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_named_example )
- 匿名互斥 ( http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_anonymous_example )
如果需要,您可以使用信号量来获得带有“消息就绪”通知的高效消息队列。参见 BIP Semaphore
最后,您可以使用无锁访问,前提是您使用专门为此设计的无锁容器,例如Shared-memory IPC synchronization (lock-free)
关于c++ - Boost共享 vector 的大小不断波动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778553/