【问题标题】: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...您的体验可能会有所不同)