使用multimap实现多线程

Multithreading with a multimap

本文关键字:多线程 实现 multimap 使用      更新时间:2023-10-16

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

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

代码片段:

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

同时我的主线程正在读取相同的静态multimap:代码捕获:

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

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

你的问题留下了太多的讨论空间:我们不知道存储在multimap中的值实际上是如何使用的。

如果:

  • 在数据结构中执行的顺序很重要,
  • 你需要在multimap中保存这些值,即使它们已经被读取,
  • 你需要在每次阅读时浏览所有条目,

那么你就会被如何优化该结构的使用所困扰。

另一方面,如果您可以以某种方式放宽这些要求之一,那么您可能有可能对事情进行一些优化,例如,通过使用消息队列而不是映射直接用于两个线程之间的通信。

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

Update:想想看,在线程之间共享这种类型的结构并不是一个好主意,不管你用它做什么。最好在一个线程内重新组合对multimap的所有访问,从而将其他线程生成的项通过队列传递给管理它的线程。这完全将生成项的工作与它们的存储和使用分离开来。在你的例子中,生产者线程将花费更少的时间来存储数据,这使得它有更多的时间来处理套接字流。

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

注意:

请注意,如果你使用的是multimap,你可能会得到多个值对于相同的键:调用find将返回一个迭代器,你可能不得不检查multimap的下一个条目,以确保你得到所有的值具有相同的键。