加速共享内存操作c++
Speeding up shared memory operations c++
我有一个用Visual Studio 2008 VC++
编写的dll
应用程序。基本上,它有两个到外部应用程序的接口。
其中一个是给作家的:
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;
但在我有那么频繁数据的地方,这个太贵了。因为每次打开共享内存&在it操作中查找容器几乎需要CCD_ 4。这意味着由于共享内存操作,出现了瓶颈。
阅读器应用程序也会出现同样的瓶颈情况。
我的问题是如何使这些共享内存操作更快?有没有办法防止每次在共享内存中打开并重新找到容器?
谢谢。
在内存中缓存最近打开的段是个好主意。假设您将缓存最后10个打开的段。创建一个singleton类,该类将包含一个将字符串映射到分段对象的字典。每次您需要从任何段读取/写入时,您都会检查这个singleton是否已经包含了它(例如通过一些id-它的名称)。如果是-你将获得它的引用/指针并对其进行读/写。否则,你将打开一个新的段并将其存储在这个singleton中。
Singleton是一个可能只有一个实例的类,通常在首次使用时创建。查看下一个链接http://forums.codeguru.com/showthread.php?423850-如何实现单点对点c。我会这样做的。
在头文件中:
class Singleton {
public:
static Singleton* instance();
void write (myData data, unsigned long id);
void select(unsigned long id);
void select(time_t insertionTime);
private:
Singleton();
static Singleton* m_singleton; // singleton instance
managed_shared_memory m_segment;
};
在cpp文件中:Singleton*Singleton::m_Singleton=NULL;
Singleton::Singleton()
: segment(open_only, "MySharedMemory")
{
// do init stuff
}
Singleton* Singleton::instance()
{
if (m_singleton== NULL)
m_singleton = new Singleton();
return m_singleton;
}
void Singleton::write (myData data, unsigned long id)
{
//Find the vector using the c-string name
MyVector *myvector = m_segment.find<MyVector>("MyVector").first;
// add code here
}
void Singleton::select(unsigned long id)
{
// your code here
}
void Singleton::select(time_t insertionTime)
{
// your code here
}
在write_interface实现器中的用法:
Singleton::instance().write (data, id);
该解决方案从程序启动到结束只确保一个实例。
在内存中缓存最近打开的段是个好主意。假设您将缓存最后10个打开的段。创建一个singleton类,该类将包含一个将字符串映射到分段对象的字典。每次您需要从任何段读取/写入时,您都会检查这个singleton是否已经包含了它(例如通过一些id-它的名称)。如果是-你将获得它的引用/指针并对其进行读/写。否则,你将打开一个新的段并将其存储在这个singleton中。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 无法合并生成操作.. 先决条件不同