c#原始数组是volatile吗?

时间:2012-07-06 07:48:04

标签: c#

我声明数组private double[] array = new double[length]。在一个线程中更新此数组项并读入另一个线程是否安全?我有最新的价值吗?

注意我没有枚举数组。我只能通过索引访问它的项目。

3 个答案:

答案 0 :(得分:4)

数组不是线程安全的,来自MSDN

  

通过集合枚举本质上不是线程安全的   程序。即使集合是同步的,其他线程也可以   仍然修改集合,这会导致枚举器抛出一个   例外。为了在枚举期间保证线程安全,您可以   要么在整个枚举过程中锁定集合,要么抓住它   由其他线程所做的更改导致的异常。

如果您一次只更新单个项目,我认为您会安全,但我不相信它,除非我找到证明它的文档。

答案 1 :(得分:2)

Volatile不保证值的新鲜度。它可以防止某些优化,但不保证线程同步。

Double不能保证updated atomically。因此,在没有同步的情况下更新/读取双精度数组将不会是线程安全的,或者没有易失性,因为您可能会读取部分写入的值。

答案 2 :(得分:0)

不,他们不是。您应该使用信号量或其他方法设计锁定系统,以确保线程安全。您可以查看producer/consumer problem