交换对象和线程安全方面的任何问题
本文关键字:任何 问题 方面 安全 对象 线程 交换 | 更新日期: 2023-09-27 18:28:46
让我们假设我们有一个属性List<Bar> Foo
,它正被多个线程读取。
是否有任何问题,这样的代码:
Foo = GetNewFooList();
可能的原因?
PS 1:这个问题是出于好奇,我还没有任何特定的代码
PS 2:是的,我知道像Foo[0]; Foo[0];
这样连续两次读取可能会返回不同的结果。这是预期行为
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
在对它的两个引用之间不发生更改,那么该代码就会失败。