具有多映射的多线程处理 环境:Windows 7、C++、多线程< /P>
我创建了一个新的工作线程来接收套接字上的数据,并将其添加到一个静态具有多映射的多线程处理 环境:Windows 7、C++、多线程< /P>,c++,multithreading,winapi,producer-consumer,C++,Multithreading,Winapi,Producer Consumer,我创建了一个新的工作线程来接收套接字上的数据,并将其添加到一个静态multimap实例中 代码段: //remember mymultimap is static data type static std::multimap<string,string> mymultimap; EnterCriticalSection(&m_criticalsection); mymultimap.insert ( "aaa", "bbb") ); LeaveCriticalSection(
multimap
实例中
代码段:
//remember mymultimap is static data type
static std::multimap<string,string> mymultimap;
EnterCriticalSection(&m_criticalsection);
mymultimap.insert ( "aaa", "bbb") );
LeaveCriticalSection(&m_criticalsection);
请帮助我提高我的应用程序性能。就目前而言,您的问题留下了太多的讨论空间:我们不知道存储在multimap中的值实际上是如何使用的 如果:
- 在该数据结构中执行的顺序很重要
- 您需要在多重映射中保留这些值,即使这些值已被读取
- 每次阅读时,你需要仔细阅读所有条目
队列
,比如std::queue
,在初始化时处理到两个线程,或者像multimap
这样的静态实例。然后,只需将第一个线程中的multimap::insert
替换为make\u对(key,value)
的queue::push\u back
,并对称地在使用者线程中,首先拥有队列中所有挂起对的pop\u-front
,同时将它们插入到映射中,然后实现对地图的处理,不管它是什么
注:
请注意,如果使用多重映射,可能会为同一个键生成多个值:调用
find
将返回一个迭代器,您可能需要检查multimap的下一个条目,以确保使用相同的键获取所有值。就目前而言,您的问题留下了太多的讨论空间:我们不知道存储在multimap中的值实际上是如何使用的
如果:
- 在该数据结构中执行的顺序很重要
- 您需要在多重映射中保留这些值,即使这些值已被读取
- 每次阅读时,你需要仔细阅读所有条目
队列
,比如std::queue
,在初始化时处理到两个线程,或者像multimap
这样的静态实例。然后,只需将第一个线程中的multimap::insert
替换为make\u对(key,value)
的queue::push\u back
,并对称地在使用者线程中,首先拥有队列中所有挂起对的pop\u-front
,同时将它们插入到映射中,然后实现对地图的处理,不管它是什么
注:
请注意,如果使用多重映射,可能会为同一个键生成多个值:调用
find
将返回一个迭代器,您可能需要检查多重映射的下一个条目,以确保使用相同的键获得所有值。取决于您在循环中所做的操作,您可以将数据复制到第二个集合,然后在离开关键部分后对副本执行(可能)长时间的操作。根据您在循环中的操作,您可以将数据复制到第二个集合,然后对副本执行(可能)长时间的操作,离开临界区后,在主线程循环中,我读取特定键的MultiMap值。我可以这样做吗?EnterCriticalSection(&m_criticalsection);std::multimap::iterator it=mymultimap.begin();LeaveCriticalSection(&m_criticalsection)@如果您只需要一个特定的键,为什么不使用multimap::find
?迭代器不会因插入而失效。不客气。我不知道为什么一开始我不推荐它,因为这通常是我为自己的项目所做的。无论如何,很高兴能提供帮助。在主线程循环中,我读取了特定键的MultiMap值。我可以这样做吗?肠危重科&m_cri
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);
EnterCriticalSection(&m_criticalsection);
///minimal lock time for Map ???
LeaveCriticalSection(&m_criticalsection);