环境: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);
请帮助我提高我的应用程序性能。
答案 0 :(得分:1)
目前您的问题仍有太多讨论空间:我们不知道多图中存储的值是如何实际使用的。
如果:
那么你几乎不知道我们如何优化该结构的使用。
另一方面,如果你能以某种方式放松其中一个要求,那么你可能有一些优化事情的可能性,例如通过使用消息队列而不是地图直接用于两个线程之间的通信。
消息队列是实现线程之间有效通信的标准方法,对于一对一设置,甚至还有无锁解决方案。
更新:考虑到这一点,在线程中共享这种类型的结构并不是一个好主意,无论你使用它做什么。最好在一个单个线程内重新组合对多图的所有访问,从而将其他线程生成的项传递给通过队列管理它的线程。这完全将生成项目的工作与其存储和使用分离。在您的情况下,生产者线程将减少存储数据的时间,这使得它有更多时间来处理套接字流。
因此,对于该解决方案,您需要queue<std::pair<key,value> >
,比如std::queue
,在初始化时处理两个线程,或者像multimap
那样处理静态实例。然后简单地用multimap::insert
的{{1}}替换第一个线程中的queue::push_back
,并在消费者线程中对称地,fisrt中有make_pair(key, value)
个所有挂起的对队列,同时将它们插入地图,然后实现您的地图处理,无论它是什么。
注意:
请注意,如果您使用的是多图,则最终可能会为同一个键设置多个值:对pop_front
的调用将返回一个迭代器,您可能需要检查下一个条目多图,以确保您获得具有相同键的所有值。