我有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;
但这个太贵了,我有频繁的数据。因为每个开放共享内存&amp;在其中查找容器操作几乎需要100 milliseconds
。这意味着由于共享内存操作存在瓶颈。
读者应用也会出现同样的瓶颈情况。
我的问题是如何让这些共享内存操作更快? 有没有办法阻止每次在共享内存中打开和重新找到容器?
谢谢。
答案 0 :(得分:0)
在内存中缓存最近打开的段是个好主意。 假设您将缓存最近10个已打开的段。 创建一个单例类,它将包含一个将字符串映射到段对象的字典。 每次需要从任何段读取/写入时,您将检查此单例是否已包含它(通过某个id - 例如其名称)。如果是 - 您将获得其引用/指针并对其进行读/写。否则,您将打开一个新段并将其存储在此单例中。
答案 1 :(得分:0)
在内存中缓存最近打开的段是个好主意。假设您将缓存最近10个已打开的段。创建一个单例类,它将包含一个将字符串映射到段对象的字典。每次需要从任何段读取/写入时,您将检查此单例是否已包含它(通过某个id - 例如其名称)。如果是 - 您将获得其引用/指针并对其进行读/写。否则,您将打开一个新段并将其存储在此单例中。
Singleton是一个只有一个实例的类,通常在第一次使用时创建。请参阅下一个链接http://forums.codeguru.com/showthread.php?423850-how-to-implement-a-singleton-in-c-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);
该解决方案仅确保一个实例,因为程序启动直到结束。