【发布时间】:2014-03-03 14:22:19
【问题描述】:
我有一个dll 应用程序,它是用Visual Studio 2008 VC++ 编写的。基本上它有两个到外部应用程序的接口。
其中一个是给作家的:
class writer_interface
{
virtual void write (myData data, unsigned long id) = 0;
}
另一个是针对阅读器应用的:
class reader_interface
{
virtual select(unsigned long id) = 0;
virtual select(time_t insertionTime) = 0;
}
所以我将元数据保存在共享内存中的容器中,我正在使用boost managed_shared_memory。
问题是外部编写器应用程序在一秒钟内调用我的写入函数 15 次,而读者在一秒钟内同时对我的共享内存容器进行 5 次查询。
因此,对于我的 Write 方法的每个 Write 函数调用,我必须打开共享内存并像这样找到我的容器:
//Open the managed segment
managed_shared_memory segment(open_only, "MySharedMemory");
//Find the vector using the c-string name
MyVector *myvector = segment.find<MyVector>("MyVector").first;
但是在我拥有如此频繁的数据的情况下,这个成本太高了。因为每次打开共享内存并在其中查找容器几乎都需要100 milliseconds。这意味着由于共享内存操作存在瓶颈。
阅读器应用也会出现同样的瓶颈情况。
我的问题是如何使这些共享内存操作更快? 有没有办法防止每次在共享内存中打开和重新找到容器?
谢谢。
【问题讨论】:
-
你不能把find的结果和segment对象一样缓存吗?
-
我试图将它分配为类属性,如变量或 smth,但每次重新进入类时它都会丢失其值。你的意思是什么类型的缓存?
标签: c++ visual-studio-2008 boost shared-memory interprocess