1

複数のスレッドによって読み取らList<Bar> Fooれているプロパティがあると仮定しましょう。

そのようなコードに問題はありますか:

Foo = GetNewFooList();

引き起こす可能性がありますか?

PS 1: この質問は好奇心からです。特定のコードは (まだ) 持っていません。

PS 2: ええ、2 つの連続した読み取りFoo[0]; Foo[0];が異なる結果を返す可能性があることは承知しています。予想通りの行動です

PS 3:質問は、予期しない例外、未定義の動作、またはその他の副作用に関するものです(この場合、未定義の動作が何であるかはわかりません-知っていれば質問しません)

4

1 に答える 1

3

が空のリストを返す場合GetFooList()、 の 2 回連続した読み取りの 2 番目でFoo[0]例外がスローされる可能性があります。より一般的には、次の場合:

int i = Foo.IndexOf(something);
Bar b1 = Foo[i];
Foo = GetNewFooList(); // happens asynchronously
Bar b2 = Foo[i];

2 番目は、次の場合に例外をスローしますi >= Foo.Count。つまり、呼び出しが短いリストを返す場合です。

1 つのスレッドがリストを反復処理している場合:

for (int i = 0; i < Foo.Count; ++i)
{
    // At this point, the other thread gets a new list,
    // whose Count <= i
    Bar b = Foo[i];  // throws an exception
    // whatever
}

これは、実際には最初の問題の単なる別の兆候です。

それは私がオフハンドで考えることができる唯一のものです。でループの問題を解決できる場合がありますforeach。ただし、雑草の中に他の問題が潜んでいないとは断言できません。

Foo一般に、コードへの 2 つの参照間で変更されないことを期待するコードがある場合、そのコードは失敗します。

于 2013-08-23T03:27:17.470 に答える