1

假设我们有一个List<Bar> Foo被多个线程读取的属性。

这样的代码是否有任何问题:

Foo = GetNewFooList();

可能导致?

PS 1:这个问题是出于好奇,我没有任何特定的代码(还)

PS 2:是的,我知道 2 次连续读取Foo[0]; Foo[0];可能会返回不同的结果。这是预期的行为

PS 3:问题更多是关于意外异常或任何类型的未定义行为或任何其他副作用(不确定在这种情况下可能是什么未定义行为- 如果我知道,我不会问这个问题)

4

1 回答 1

3

如果GetFooList()返回一个空列表,则两次连续读取中的第二次Foo[0]可能会引发异常。更一般地说,如果您有:

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

第二个将抛出异常 if i >= Foo.Count。也就是说,如果调用返回一个较短的列表。

如果一个线程正在遍历列表:

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在两次引用之间发生变化,那么该代码将会失败。

于 2013-08-23T03:27:17.470 回答