Sca*_*avs 3 c# arrays concurrency multithreading
假设我们有一个由两个元素组成的数组,它们是某种原始值的类型。
volatile int[] a = new int[2]{0,0};
Run Code Online (Sandbox Code Playgroud)
我有两个线程,每个线程都写入/读取其中一个元素。第一个线程仅适用于 a[0],第二个线程仅适用于 a[1]。
数组可以这样工作吗,或者数组仍然需要被锁定,即使不同的索引值受到影响?
线程不需要对未被任何其他线程使用的内存位置发出锁定。所以在你的情况下,lock声明是不必要的。
话虽如此,您应该担心 CPU 缓存锁定。如果a[0]和a[1]都在同一个 64 字节块内,它们将共享一个缓存行,这意味着每个 CPU 内核将尝试将该内存块加载到板载缓存中,从而锁定任何其他 CPU 内核。如果发生这种情况,一次只有一个线程可以访问这些变量,并且任何其他线程都将阻塞,直到缓存被推回主内存并释放锁。这个问题,称为虚假共享,将限制您的性能,使多线程方法的性能不会比单线程解决方案更好,甚至可能更差。没有办法关闭这个锁,尽管你可以通过在内存中将变量间隔开来避免它,这样它们就会落在不同的 64 字节块中。
(64 字节基于现代 Wintel ......您的体验可能会有所不同)
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |