假设我们有一个属性List<Bar> Foo
,该属性正在被多个线程读取。
有没有这样的代码问题:
Foo = GetNewFooList();
可能会导致?
PS 1:这个问题出于好奇,我没有任何特定代码(尚未)
PS 2:是的,我知道像
Foo[0]; Foo[0];
这样的2次连续读取可能会返回不同的结果。这是预期的行为PS 3:问题更多是关于意外的异常或任何类型的未定义行为或任何其他副作用(不确定在这种情况下是什么未定义行为-如果我知道,我不会问这个问题)
最佳答案
如果GetFooList()
返回一个空列表,则Foo[0]
的两次连续读取中的第二次可能会引发异常。更一般而言,如果您具有:
int i = Foo.IndexOf(something);
Bar b1 = Foo[i];
Foo = GetNewFooList(); // happens asynchronously
Bar b2 = Foo[i];
如果
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
在两个引用之间不发生变化,则该代码将失败。
关于c# - 交换对象和线程安全性有任何问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18393033/