gpt4 book ai didi

c# - 安全读取其元素同时更改的 long[] 内容的最快方法

转载 作者:行者123 更新时间:2023-11-30 16:39:34 25 4
gpt4 key购买 nike

当你有一个

long[] myArray = new long[256];

其项目被多个线程使用更改

Interlocked.Increment(ref myArray[x])

肯定不可能在某个时间点获取 myArray 的快照,因为有非锁定写入并发进行,所以我不想获取它。

那么我真的必须像这样对每个元素进行 Volatile.Read 以获取过去某个时间点的所有值的副本吗?

long[] copy = new long[256];
for (int i = 0; i < 256; i++)
copy[i] = Volatile.Read(ref myArray[i]);

因为我对某个时间点的快照不感兴趣,过时的值不是问题,但由于 64 位非 volatile 读取不是原子的,我担心以下内容可能会给我预增量一半是长的,一半是后递增的,这可能给出数组中不存在的值。

long[] copy = new long[256];
for (int i = 0; i < 256; i++)
copy[i] = myArray[i];

鉴于我不想使用任何锁定,Volatile.Read 变体是否是正确的选择?

最佳答案

如果陈旧值对您来说不是问题,并且您只需要原子读取(不是有序读取),那么在 x64 上您可以只使用普通读取而不是 Volatile.Read。它在 ARM 系统上可能是有益的,其中 volatile 读/写是相当重量级的,因为它们是使用 DMB 实现的。

重要根据thisthat ,您需要(构建和)在 64 位模式下运行您的 .Net 程序才能正常工作:

if you are running C# code on a 64 bit operating system in a 64 bit version of the CLR then reads and writes of 64 bit doubles and long integers are also guaranteed to be atomic

关于c# - 安全读取其元素同时更改的 long[] 内容的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com