我有多个消费者线程和一个生产者线程。生产者线程将数据写入属于某个消费者线程的映射中,并向消费者线程发送信号。当我插入和擦除数据时,我在地图周围使用互斥锁。但是这种方法在速度性能方面看起来效率不高。你可以建议另一种方法,而不是地图,需要互斥锁和解锁,我认为互斥减慢传输。C++多线程缓慢处理
回答
但是这种方法在速度性能方面看起来效率不高。你可以建议另一种方法,而不是地图,需要互斥锁和解锁,我认为互斥减慢传输。
您应该使用分析器来确定瓶颈的位置。
生产者线程把数据写入到地图属于某个消费者线程并发送信号给消费者线程。
生产者不应该关心消费者使用什么样的数据结构 - 这是消费者的实现细节。请记住,将值插入映射需要内存分配(除非使用自定义分配器),并且内存分配内部也会锁定以保护堆状态。最终的结果是锁定一个互斥量大约在map::insert
的操作可能会将其锁定的时间太长。
一个更简单和更高效的设计是在生产者和消费者之间有一个原子队列(例如pipe,TBB concurrent_bounded_queue,它预先分配它的存储以便推/拉操作非常快)。由于您的生产者直接与每个消费者进行通信,因此该队列是一个一个读写器的阅读器,并且可以实现为一个等待队列(或环形缓冲区a-la C++ disruptor)。
Andrei Alexandrescu提出了很好的一点,那就是你应该测量你的代码(https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920),这与我给你的建议是一样的,就是测量你的代码,看看你在基准测试和测试运行单线程:
- 使用单线程与上面列出的数据
- 插入使用单线程与上面列出的数据映射,并使用互斥 锁数据 所需的时间映射 插入数据所需的时间
如果你还在寻找一个线程安全的容器,你可能想看看英特尔的开源实施线程安全的容器在http://www.threadingbuildingblocks.org/docs/help/reference/containers_overview/concurrent_queue_cls.htm。
而且,对于消费者线程执行的建议,您可能需要阅读的的activeObject文章认为香草萨特张贴在他的网站:http://herbsutter.com/2010/07/12/effective-concurrency-prefer-using-active-objects-instead-of-naked-threads/
如果你能提供一些更多的细节,比如为什么地图必须始终锁定,我们可能能够起草一个效果更好的机制。
- 1. 缓慢处理
- 2. 缓慢线程处理的缓解技术
- 3. 缓慢处理UserControl
- 4. C#图像处理非常缓慢
- 5. 使用cython进行缓慢多处理
- 6. Python多处理队列缓慢
- 7. C#多线程 - 很慢
- 8. C++ Pthreads - 多线程比单线程慢
- 9. Sitecore ECM处理流程缓慢
- 10. 核心数据在后台线程上处理更新缓慢
- 11. 多线程处理?
- 12. 多线程处理
- 13. C# - 并行Foreach缓慢创建线程
- 14. ExecutorService缓慢多线程性能
- 15. 卷曲缓慢多线程dns
- 16. SQL executeBatch缓慢处理
- 17. 多线程opencv视频处理Qt/C++
- 18. C++ Builder,TIdTCPServer的多线程处理
- 19. C++中的多线程事件处理
- 20. Python多重处理比Windows上的多线程稍微慢
- 21. Python - 多线程/多处理
- 22. 多线程缓冲区C++
- 23. Qt - 缓慢的GUI - 线程
- 24. C#中的多线程处理以及如何处理
- 25. 处理多线程的线程
- 26. 在大量内存访问的情况下,多线程的处理速度比单线程缓慢
- 27. 线程事件处理(C#)
- 28. 如何处理线程C#
- 29. 处理器线程C#
- 30. C# - 处理线程帮助
你能推荐一些这些队列的实现例子吗?他们在STL或其他地方是标准吗?你的意思是std :: atomic? –
@AvbAvb我添加了几个参考。 –