Multithreading scenario for list
我已阅读此模式,但发现它不起作用。我得到一个罕见的例外,即 foreach 中的项目已更改。
锁定(我的列表)
{
foreach(var a in myList) {}
myList = new List<>() (或 myList.Clear() )
}
我也试过这个
foreach(var a in myList.ToList() ) { }
这也产生了异常。此线程中描述了一些其他模式,但我想确认/理解为什么上述模式不起作用
我已经阅读了一些关于如何正确锁定列表的内容。该异常并不经常发生——只是非常罕见,而且当时还存在内存泄漏。
1。
我是否需要在修改 myList 的任何地方都使用锁,还是锁会阻止任何人编辑 mylist?这可能是混乱的根源。
2.
lock mylist 和强制转换和使用 syncroot 有区别吗?
看这里
在多线程场景中正确锁定列表< T >?
一般来说,如果您有一个共享资源,那么您需要锁定一个互斥锁,以在您使用该资源时保护该资源。不管是读还是写。如果互斥锁未锁定在您使用共享资源的至少一个地方,那么您就有问题了。例如,如果您只在修改共享资源时锁定它,那么可能某个线程正在读取它,而另一个线程正在修改它——这种情况称为竞争条件。
在您的特定情况下,是的,您需要在修改 mylist 的任何地方锁定它。不仅在您修改它的地方,而且在您阅读它的任何地方。