gpt4 book ai didi

c# - Interlocked.Read/Exchange for longs on 64-bit architectures

转载 作者:太空狗 更新时间:2023-10-30 01:15:33 25 4
gpt4 key购买 nike

Interlocked.Read(ref long) 是否在 64 位架构上“优化掉”了? IE。如果我正在编写一个可以被两种架构使用的库,我是否应该担心在 64 位 CPU 上不必要地使用 Interlocked.Read 对性能的影响?

我想过使用这样的东西,所以我想知道这是否有意义:

    // X64 is a preprocessor constant set for x64 builds  

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static long Read(ref long address)
{
#if X64
// atomic on 64-bit processors
return address;
#else
// if I got it right, this creates a full memory barrier
return Interlocked.Read(ref address);
#endif
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Write(ref long address, long value)
{
#if X64
// atomic on 64-bit processors
address = value;
#else
// if I got it right, this creates a full memory barrier
Interlocked.Exchange(ref address, value);
#endif
}

最佳答案

是的,您不必要地担心 Interlocked 的性能影响,因为 Interlocked只是对值执行原子操作,它还确保该值对所有线程可见(顺序一致性)。让我解释。在某些架构(包括某些 64 位架构)上,写入内存位置的值可能会被缓存以提高性能。尽管是原子操作,但简单地读取一个值可能无法读取另一个线程写入的“最新”值。 Interlocked 还执行内存栅栏,以便栅栏之前的任何操作都将缓存的值刷新到实际内存中。因此,虽然您可能会稍微提高性能,但您也会引入潜在的竞争条件。在这不是问题的架构上,Interlocked 不会执行额外的工作并为您进行优化。

不幸的是,Interlocked 的文档仍然没有完全符合这些细节。参见 http://www.albahari.com/threading/part4.aspx有关 Interlocked 操作中涉及的栅栏的更多详细信息。

关于c# - Interlocked.Read/Exchange for longs on 64-bit architectures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37795109/

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