0

我已经阅读了这种模式,但发现它不起作用。我得到一个罕见的例外,即 foreach 中的项目已更改。

lock (mylist) { foreach(var a in myList) {}

myList = new List<>() (或 myList.Clear() ) }

我也试过这个

foreach(var a in myList.ToList() ) { }

这也产生了异常。这个线程中描述了一些其他模式,但我想确认/理解为什么上述模式不起作用我已经阅读了一些关于如何正确锁定列表的信息。该异常并不经常发生——只是非常罕见,而且当时还存在内存泄漏。

1. 我是否需要在修改 myList 的任何地方都使用锁,或者锁会阻止任何人编辑 mylist?这可能是混乱的根源。

2.

锁定 mylist 和强制转换以及使用 syncroot 有区别吗?

看这里

在多线程场景中正确锁定 List<T>?

4

1 回答 1

1

通常,如果您有一个共享资源,那么您需要锁定一个互斥锁,以在您使用该资源时保护该资源。不管是读还是写都无所谓。如果互斥锁未锁定在您使用共享资源的至少一个地方,那么您就有问题了。例如,如果您只在修改共享资源时锁定它,那么可能某个线程正在读取它,而另一个线程正在修改它——这种情况称为竞争条件。

在您的特定情况下,是的,您需要在修改它的任何地方锁定 mylist。不仅在你修改它的地方,而且在你阅读它的任何地方。

于 2013-01-15T18:22:25.443 回答