首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程与多线程

多线程与多线程
EN

Stack Overflow用户
提问于 2013-02-27 13:06:47
回答 1查看 1.2K关注 0票数 1

环境:Windows7.0,C++,多线程

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

代码片段:

代码语言:javascript
复制
//remember mymultimap is static data type
static std::multimap<string,string> mymultimap;
EnterCriticalSection(&m_criticalsection);
mymultimap.insert ( "aaa", "bbb") );
LeaveCriticalSection(&m_criticalsection);

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

代码语言:javascript
复制
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中使线程锁定时间最短?

代码语言:javascript
复制
EnterCriticalSection(&m_criticalsection);
///minimal lock time for Map ???
LeaveCriticalSection(&m_criticalsection);

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

EN

回答 1

Stack Overflow用户

发布于 2013-02-27 13:18:16

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

如果:

  • 在数据结构中强制执行的顺序很重要,
  • 即使在读取了这些值之后,也需要将它们保存在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的下一个条目,以确保使用相同的键获得所有值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15112883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档