Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多映射的多线程处理 环境:Windows 7、C++、多线程< /P>_C++_Multithreading_Winapi_Producer Consumer - Fatal编程技术网

具有多映射的多线程处理 环境: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中的值实际上是如何使用的

如果:

  • 在该数据结构中执行的顺序很重要
  • 您需要在多重映射中保留这些值,即使这些值已被读取
  • 每次阅读时,你需要仔细阅读所有条目
然后,你会被我们如何优化该结构的使用所困扰

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

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

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

因此,对于该解决方案,您需要一个
队列
,比如
std::queue
,在初始化时处理到两个线程,或者像
multimap
这样的静态实例。然后,只需将第一个线程中的
multimap::insert
替换为
make\u对(key,value)
queue::push\u back
,并对称地在使用者线程中,首先拥有队列中所有挂起对的
pop\u-front
,同时将它们插入到映射中,然后实现对地图的处理,不管它是什么

注:


请注意,如果使用多重映射,可能会为同一个键生成多个值:调用
find
将返回一个迭代器,您可能需要检查multimap的下一个条目,以确保使用相同的键获取所有值。

就目前而言,您的问题留下了太多的讨论空间:我们不知道存储在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);