使用多图的多线程

时间:2013-02-27 13:06:48

标签: c++ multithreading winapi producer-consumer

环境: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);

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

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

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

1 个答案:

答案 0 :(得分:1)

目前您的问题仍有太多讨论空间:我们不知道多图中存储的值是如何实际使用的。

如果:

  • 在该数据结构中强制执行的顺序很重要,
  • 即使在阅读完毕后,您也需要保留多图中的值,
  • 每次阅读时都需要查看所有条目,

那么你几乎不知道我们如何优化该结构的使用。

另一方面,如果你能以某种方式放松其中一个要求,那么你可能有一些优化事情的可能性,例如通过使用消息队列而不是地图直接用于两个线程之间的通信。

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

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

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

注意:

请注意,如果您使用的是多图,则最终可能会为同一个键设置多个值:对pop_front的调用将返回一个迭代器,您可能需要检查下一个条目多图,以确保您获得具有相同键的所有值。