使用multimap实现多线程
Multithreading with a multimap
环境:Windows 7.0, c++,多线程
我已经创建了一个新的工作线程来接收socket上的数据,并将其添加到静态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中保存这些值,即使它们已经被读取,
- 你需要在每次阅读时浏览所有条目,
那么你就会被如何优化该结构的使用所困扰。
另一方面,如果您可以以某种方式放宽这些要求之一,那么您可能有可能对事情进行一些优化,例如,通过使用消息队列而不是映射直接用于两个线程之间的通信。
消息队列是实现线程间高效通信的标准方法,对于一对一设置,甚至有无锁的解决方案。
Update:想想看,在线程之间共享这种类型的结构并不是一个好主意,不管你用它做什么。最好在一个线程内重新组合对multimap的所有访问,从而将其他线程生成的项通过队列传递给管理它的线程。这完全将生成项的工作与它们的存储和使用分离开来。在你的例子中,生产者线程将花费更少的时间来存储数据,这使得它有更多的时间来处理套接字流。
因此,对于该解决方案,您需要一个queue<std::pair<key,value> >
,例如std::queue
,在初始化时处理两个线程,或者像multimap
这样的静态实例。然后简单地将第一个线程中的multimap::insert
替换为make_pair(key, value)
的queue::push_back
,并对称地在消费者线程中,首先拥有队列中所有挂起对的pop_front
,同时将它们插入到映射中,然后实现对映射的处理,无论它是什么。
注意:
请注意,如果你使用的是multimap,你可能会得到多个值对于相同的键:调用find
将返回一个迭代器,你可能不得不检查multimap的下一个条目,以确保你得到所有的值具有相同的键。
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 实现在多线程代码中安全恢复的断点
- 实现多线程后"Project.exe has triggered a breakpoint"
- OpenMP:共享同一算法的单线程和多线程实现
- 要求在c++11中实现多线程矩阵乘法
- 如何实现多线程异步操作
- 如何在不使用的情况下在 <mutex>C++11 中实现多线程安全单例
- 多线程状态机在C/C++中的实现
- 为多线程环境实现单例的内存泄漏
- C++ STL 算法(列表排序)OpenMP/多线程实现
- 如何在openssl中实现多线程
- 考虑 CPU 提升模式的多线程超线性性能实现
- 使用boost库是c++中实现多线程的正确方法
- 这是交换(多线程)的异常安全实现吗
- 如何为多线程访问实现类锁定对象
- 多线程实现中的errno
- 在具有动态大小内存池的多线程C/C++中实现内存管理器
- 如何在C/C++中实现确定性多线程
- MD5暴力攻击高效多线程实现
- Swapcontext在多对多线程实现中失败