2013-01-15 59 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。不僅在你修改它的地方,而且你在任何地方閱讀它。