gpt4 book ai didi

c++ - 使用 multimap 的多线程

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:33 24 4
gpt4 key购买 nike

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

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

最佳答案

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

如果:

  • 在该数据结构中强制执行的顺序很重要,
  • 即使在读取它们之后,您也需要将值保留在 multimap 中,
  • 每次阅读时都需要通读所有条目,

那么您对我们如何优化该结构的使用几乎一头雾水。

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

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

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

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

注意:

请注意,如果您使用的是多重映射,您最终可能会为同一个键获得多个值:对 find 的调用将返回一个迭代器,您可能必须检查 multimap 的下一个条目以确保您获得具有相同键的所有值。

关于c++ - 使用 multimap 的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15112883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com