この質問に関係のないバグを探していくつかのデータベースList<T>
コードを調べているときに、いくつかの場所で不適切に使用されていることに気付きました。具体的には:
List
as リーダーに同時にアクセスしている多くのスレッドがありましたが、 の代わりにへのインデックスを使用していました。list
enumerators
- への単一のライターがありました
list
。 - 同期はゼロで、リーダーとライターは
list
同時に にアクセスしていましたが、コード構造のため、を実行したメソッドが返されるまで、最後の要素にアクセスすることはありませんでした。Add()
- から削除された要素はありません
list
。
C#のドキュメントによると、これはスレッド セーフではありません。それでも失敗したことはありません。の特定の実装のためにList
(内部的には、スペースが不足したときに再割り当てする配列であると想定しています)、1-writer 0-enumerator n-reader add-only シナリオが誤ってスレッドセーフになっているのではないかと思っています。または、現在の.NET4実装でこれが爆発する可能性が低いシナリオはありますか?
編集:いくつかの返信を読むのを忘れた重要な詳細。リーダーは、List
とその内容を読み取り専用として扱います。