0

このパターンを読んだことがありますが、うまくいかないことがわかりました。foreach の項目が変更されたというまれな例外が発生します。

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

myList = new List<>() (または myList.Clear() ) }

私もこれを試しました

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

そして、それも例外を生成しました。このスレッドには他にもいくつかのパターンが説明されていますが、上記のパターンが機能しない理由を確認/理解したいので、リストを適切にロックする方法について少し読みました。例外は頻繁には発生しません。非常にまれであり、その時点でメモリ リークも発生していました。

1. myList を変更するたびにロックを使用する必要がありますか? それとも、ロックによって mylist を編集できなくなりますか? これが混乱の元かもしれません。

2.

lock mylist とキャストと syncroot の使用に違いはありますか?

こちらをご覧ください

マルチスレッドシナリオで List<T> を適切にロックしていますか?

4

1 に答える 1

1

一般に、共有リソースがある場合は、このリソースを使用するたびに、リソースを保護するミューテックスをロックする必要があります。読み取りか書き込みかは関係ありません。共有リソースを使用する場所の少なくとも1つでミューテックスがロックされていない場合は、問題が発生しています。たとえば、共有リソースを変更しているときにのみロックすると、あるスレッドがそれを読み取っているときに別のスレッドがそれを変更している可能性があります。競合状態と呼ばれる状況が発生します。

あなたの特定のケースでは、はい、あなたはそれを変更するすべての場所でマイリストをロックする必要があります。そして、あなたがそれを修正する場所だけでなく、あなたがそれを読むすべての場所でも。

于 2013-01-15T18:22:25.443 に答える