【问题标题】:Reading and Writing array in multithreaded environment [duplicate]多线程环境中的读写数组[重复]
【发布时间】:2017-11-23 16:18:54
【问题描述】:

假设我们有一个由两个元素组成的数组,它们是某种原始值的类型。

volatile int[] a = new int[2]{0,0};

我有两个线程,每个线程都写入/读取其中一个元素。 第一个线程使用 a[0],第二个线程使用 a[1]。

数组可以这样工作吗,或者数组仍然需要锁定,即使不同的索引值受到影响?

【问题讨论】:

标签: c# arrays multithreading concurrency


【解决方案1】:

线程不需要在没有被任何其他线程使用的内存位置上发出锁。所以在你的情况下,lock 声明是不必要的。

话虽如此,您应该担心 CPU 缓存锁定。如果a[0]a[1] 都属于同一个64 字节块,它们将共享一个cache line,这意味着每个CPU 内核都会尝试将该内存块加载到板载缓存中,从而锁定任何其他CPU 内核。如果发生这种情况,一次只有一个线程可以访问这些变量,并且任何其他线程都会阻塞,直到缓存被推回主内存并释放锁。这个被称为false sharing 的问题会限制您的性能,使多线程方法的性能不会比单线程解决方案好,甚至可能更差。没有办法关闭此锁,但您可以通过在内存中将变量隔开以使它们落入不同的 64 字节块中来避免它。

(64 字节基于现代 Wintel...您的体验可能会有所不同)

【讨论】:

  • 非常有趣的感谢帖子+1
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多