如果我们有一个ConcurrentBag<object>
装满 100 个对象的 safeBag`。
然后一个线程工作为:
foreach(object o in safeBag)
{
Thread.Sleep(1000);
}
另一个线程在第一个线程启动后立即启动:
{
safeBag.AddOrTake(something);
}
第二个线程会等待 100 秒进入资源吗?另一个问题,如果第一个线程使用 Parallel.ForEach() 运行,线程将如何工作?
编辑:MSDN 说:“一个列表可以同时支持多个读取器,只要不修改集合。通过集合枚举本质上不是线程安全的过程。在极少数情况下,枚举与一个或多个写入竞争访问,确保线程安全的唯一方法是在整个枚举期间锁定集合。” 通过 ConcurrentBag 进行枚举是否会导致第二个线程等待对 ConcurrentBag 的写入访问?