![]() |
1
28
到目前为止,.NET还具有相对“低级别”的并发支持,但是.NET 4.0引入了
安德鲁的答案在如何处理.NET 4.0之前的托收方面是完全正确的-当然还有 最 在访问“普通”共享集合时使用I'd just lock appropriately。然而,并发集合使生产者/消费者队列等的使用变得容易。 |
![]() |
2
19
C提供了跨多个线程处理集合的几种方法。对于这些技巧的一个好的描述,我建议您从 Collections and Synchronization (Thread Safety) 以下内容:
|
![]() |
3
6
正如jon skeet提到的,现在在.NET 4的system.collections.concurrent命名空间中有“线程安全”集合。 在以前的.NET框架版本中不存在并发集合(至少我猜是这样)的原因之一是,即使使用并发集合,也很难保证线程安全。 (这并非完全正确,因为有些集合提供了一个同步方法,从非线程安全集合返回线程安全集合,因此存在一些线程安全集合…) 例如,假设一个有一个线程安全字典——如果只想插入,如果该键不存在,则首先查询集合以查看该键是否存在,如果该键不存在,则执行插入。不过,这两个操作不是线程安全的,在containsKey的查询和add操作之间,另一个线程可能已经插入了该键,因此存在争用条件。 换句话说,集合的操作是线程安全的——但使用它并不一定是安全的。在这种情况下,需要转换回传统的锁定技术(mutex/monitor/semaphore…)以实现线程安全性,因此并发收集在多线程安全性方面没有给您带来任何好处(但可能对性能不利)。 |