- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在我的应用程序中使用基于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++ 标准。
事实上 - 在大多数现实生活中,您实际上需要一个互斥锁来锁定共享内存区域的创建(除非您可以证明该创建是单线程的)。
看看
如果需要,您可以使用信号量来获得带有“消息就绪”通知的高效消息队列。参见 BIP Semaphore
最后,您可以使用无锁访问,前提是您使用专门为此设计的无锁容器,例如Shared-memory IPC synchronization (lock-free)
关于c++ - Boost共享 vector 的大小不断波动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778553/
我面临一个非常奇怪的问题。 我想实现从DataTable中删除行的选项,因此实现了以下方法: onRemoveRow() { setState( () { last
我正在 JavaScript 中处理物理问题,并且我有一个值指示“物理”世界中的接触数量。这个值可以在0-6之间。问题是i波动很大。我想要的是过滤掉尖峰。假设该数字是 3,然后在不到一秒的时间内它会变
我在 C 中有两个静态可变变量,我想在逻辑语句中检查它们。但是,当我这样做时,我收到警告“未定义的行为:此语句 1037 中未定义 volatile 访问的顺序”是否有可能在很短的时间内暂停 C 变量
我是 C Sharp 的新手,正在使用 XNA Framework 编写游戏。我创建了一个项目,它是“Platformer”XNA 入门工具包的重大修改版本。 我看到(看似)随帧率随机波动。有时它会一
我是一名优秀的程序员,十分优秀!