c# - 交换对象和线程安全性有任何问题吗?

标签 c# .net multithreading concurrency thread-safety

假设我们有一个属性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/

相关文章:

java - 在 Java 中的多线程进程中更新 boolean 值

c# - 如何从 C++ 后台任务(Windows 通用应用程序)调用 C# 函数?

c# - 我可以为 Windows Universal App 创建闹钟应用程序吗?

C#:为什么Application在System.Windows.Forms中?

c# - 如何使用 AutoFixture 在保留类型自定义的同时使用自定义属性进行构建?

Java 线程池 - 线程正在更新吗?

C# 多线程代码问题损坏数据

c# - 如何从字符串中获取最后 2 个单词(从倒数第二个空格开始)?

c# - 使用 Ninject 跨类传递参数

c# - 多线程和委托(delegate)执行