Boost 共享向量的大小不断波动
Size of the Boost shared vector keeps fluctuating
我正在使用基于Boost
的shared vector
作为应用程序中的IPC
。
在我尝试读取共享内存的应用程序中,内存的大小、m_size或vector->size
在 2(即我共享的向量数量)和 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
,其中有一个数组,还有一些sempahores。最终,正是这种结构在内存中共享。
就我而言,我在共享内存中共享一个向量。同样的原则是否有效,即我创建一个内部带有向量的结构,以及互斥体成员,并共享它?在这种情况下,要映射的结构以及因此的内存分配器将是struct
的结构,而不是 Vector 的结构,就像我在代码中所做的那样,对吗?
恳请指教。
是的,您似乎没有任何锁定。
在进程之间共享内存存在并发突变/访问的风险。为此,您需要锁定。否则,您将引入数据争用,并根据 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 信号量
最后,如果您使用专门为此设计的无锁容器,则可以使用无锁访问,例如共享内存IPC同步(无锁)
- 为共享 ptr 向量实现复制 c'tor?
- 字符串共享内存映射的向量
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 我可以使用 std::vector::swap 来修改共享向量吗?
- 制作一对共享指针并推送一个向量
- 初始化可变数据结构中的共享指针向量
- 在两个类实例之间共享向量
- 读/写 OpenMP 中的共享向量会减慢程序速度
- 如何将现有对象push_back到共享指针的向量?
- 在向量中使用共享指针来访问类对象
- 如何在共享指针向量中检查重复的"ofstream"对象
- 使用互斥锁和条件变量增强跨内存的进程间共享向量
- 我可以有一个与另一个向量共享存储的向量
- <T>通过引用传输向量<shared_ptr>而不绕过共享语义
- 在多个c++文件中共享向量变量
- 在类之间共享向量时,无法解析的外部符号向量
- 增强线程共享向量
- 线程之间通过共享向量进行通信
- Boost 共享向量的大小不断波动