Dus*_*vis 16 .net-4.0 task-parallel-library
ConcurrentBag将允许多个线程添加和删除包中的项目.线程可能会将一个项目添加到包中,然后最终将该项目重新取出.它说ConcurrentBag是无序的,但是它有多无序?在单个线程上,行李就像一个堆栈.无序意味着"不像链接列表"吗?
ConcurrentBag的真实用途是什么?
Ivo*_*ops 17
因为没有排序,ConcurrentBag比ConcurrentStack/Queue具有性能优势.它由Microsoft实现为本地线程存储.因此,添加项目的每个线程都会在自己的空间中执行此操作.检索项目时,它们来自本地存储.只有当它为空时,线程才会从另一个线程存储中窃取项目.因此,ConcurrentBag不是一个简单的列表,而是一个分布式的项目列表.并且几乎是无锁的,并且应该在高并发性的情况下更好地扩展.
不幸的是,在.NET 4.0中存在性能问题(在4.5中修复),请参阅 http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0
包对于跟踪实例计数非常有用。例如,如果您想记录正在为哪些主机提供 Web 请求服务,则可以在开始为请求提供服务时将其 IP 添加到包中,并在完成后将其删除。
使用包可以让您一目了然地知道您当前正在为哪些 IP 提供服务。它还可以让您快速查询您是否正在为给定的 IP 地址提供服务。
如果您使用一组而不是包,那么来自同一 IP 地址的多个并发请求将会扰乱您的记录保存。
归档时间: |
|
查看次数: |
9282 次 |
最近记录: |