2013-01-15 30 views
0

我读过这些模式,但发现它不起作用。我收到了一个罕见的例外,即foreach中的某个项目发生了更改。列表的多线程场景

锁(MYLIST) { 的foreach(在myList中VAR一){}

myList中=新列表<>()(或myList.Clear()) }

我也尝试这

的foreach(在myList.ToList VAR一()){}

而这也产生了异常。本主题中描述了一些其他模式,但我想确认/理解为什么上述模式不起作用 我已阅读了一些关于如何正确锁定列表的内容。这种异常并不经常发生 - 很少发生,当时还有内存泄漏。

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

2.

是否有锁MYLIST和铸造和使用SyncRoot上有区别吗?

这里

Properly locking a List<T> in MultiThreaded Scenarios?

+0

关于1:是的,你需要锁定无论你修改列表甚至读取它。这就是应该如何使用锁。 – ilmiacs

+0

这里有一个伟大的(免费)电子书:['Albahari'](http://www.albahari.com/threading/) –

回答

1

见一般来说,如果你有一个共享的资源,那么你需要锁定只要您使用这个资源保护资源互斥。如果只是阅读或写作,无所谓。如果至少在您使用共享资源的某个位置锁定了互斥体,则会出现问题。例如,如果在修改共享资源的同时只锁定共享资源,则某个线程可能正在读取而另一个线程正在修改它 - 这种情况称为竞争状态。

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