1

环境:Windows 7.0,C++,多线程

我创建了一个新的工作线程来接收套接字上的数据并将其添加到静态multimap实例中。

代码片段:

//remember mymultimap is static data type
static std::multimap<string,string> mymultimap;
EnterCriticalSection(&m_criticalsection);
mymultimap.insert ( "aaa", "bbb") );
LeaveCriticalSection(&m_criticalsection);

同时我的主线程正在读取相同的静态多图:代码快照:

EnterCriticalSection(&m_criticalsection);
std::multimap<string,string>::iterator it = mymultimap.begin();
for( ; it != mymultimap.end(); it++)
{
std::string firstName = (*it).first;
std::string secondName = (*it).second;
}
LeaveCriticalSection(&m_criticalsection);

由于主线程和工作线程不断地进行读写,它妨碍了我的应用程序性能。该实例还multimap包含大量数据(超过 10,000 条记录)。

如何在 multimap 中使线程锁定的时间最短?

EnterCriticalSection(&m_criticalsection);
///minimal lock time for Map ???
LeaveCriticalSection(&m_criticalsection);

请帮助我提高我的应用程序性能。

4

1 回答 1

1

就目前而言,您的问题留下了太多讨论的空间:我们不知道存储在您的多重映射中的值是如何实际使用的。

如果:

  • 该数据结构中强制执行的顺序很重要,
  • 即使在读取它们之后,您也需要将值保留在多图中,
  • 每次阅读时都需要浏览所有条目,

那么您对于我们如何优化该结构的使用非常困惑。

另一方面,如果你能以某种方式放宽其中一个要求,那么你可能会稍微优化一下,例如通过使用消息队列而不是直接映射来在两个线程之间进行通信。

消息队列是实现线程之间高效通信的标准方式,对于一对一的设置,甚至还有无锁解决方案。

更新:考虑一下,跨线程共享这种类型的结构不是一个好主意,无论您如何使用它。最好在一个线程中重新组合对多映射的所有访问,从而将其他线程生成的项目通过队列传递给管理它的线程。这将生成项目的工作与其存储和使用完全分离。在您的情况下,生产者线程将花费更少的时间来存储数据,从而留出更多时间来处理套接字流。

因此,对于该解决方案,您需要一个queue<std::pair<key,value> >,比如说std::queue,在初始化时处理给两个线程,或者像一个静态实例一样multimap。然后简单地将multimap::insert第一个线程中的 a替换queue::push_back为 a make_pair(key, value),并在消费者线程中对称地,pop_front首先在队列中拥有所有未决对中的 a ,同时将它们插入映射中,然后实现对映射的处理,不管是什么。

笔记:

请注意,如果您使用的是多重映射,您可能最终会得到同一个键的多个值:调用find将返回一个迭代器,您可能必须检查多重映射的下一个条目以确保您得到所有具有相同键的值。

于 2013-02-27T13:18:16.260 回答