环境:Windows7.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);同时,我的主线程正在读取相同的静态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);请帮助我提高我的应用程序性能。
发布于 2013-02-27 13:18:16
就目前情况而言,您的问题给讨论留下了太多的空间:我们不知道存储在multimap中的值是如何实际使用的。
如果:
那么,我们如何才能优化该结构的使用,您就陷入了困境。
另一方面,如果您可以在某种程度上放松这些需求之一,那么您就有可能对事物进行一些优化,例如,通过使用消息队列而不是直接映射来实现两个线程之间的通信。
消息队列是实现线程间高效通信的标准方法,对于一对一的设置,甚至有无锁解决方案。
Update:想一想,不管您如何利用它,共享这种类型的结构交叉线程并不是一个好主意。最好在一个线程中重新组合对multimap的所有访问,从而使其他线程生成的项通过队列传递给管理它的线程。这使生成项目的工作与它们的存储和使用完全脱钩。在您的示例中,生产者线程将减少存储数据的时间,从而为处理套接字流留出更多的时间。
因此,对于该解决方案,您需要一个queue<std::pair<key,value> >,比如std::queue,在两个线程初始化时对它们进行处理,或者像multimap那样的静态实例。然后简单地将第一个线程中的multimap::insert替换为make_pair(key, value)的queue::push_back,然后在使用者线程中对称地替换first,在队列中有一个包含所有挂起对的pop_front,同时将它们插入到映射中,然后实现您对地图的处理,不管它是什么。
注意:
请注意,如果您使用的是multimap,您可能会得到相同键的多个值:对find的调用将返回一个迭代器,您很可能必须检查multimap的下一个条目,以确保使用相同的键获得所有值。
https://stackoverflow.com/questions/15112883
复制相似问题