加速共享内存操作c++

Speeding up shared memory operations c++

本文关键字:c++ 操作 内存 共享 加速      更新时间:2023-10-16

我有一个用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中。