加快共享内存操作c ++

时间:2014-03-03 14:22:20

标签: c++ visual-studio-2008 boost shared-memory interprocess

我有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。这意味着由于共享内存操作存在瓶颈。

读者应用也会出现同样的瓶颈情况。

我的问题是如何让这些共享内存操作更快? 有没有办法阻止每次在共享内存中打开和重新找到容器?

谢谢。

2 个答案:

答案 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);

该解决方案仅确保一个实例,因为程序启动直到结束。