Interlocked.Read/Exchange for longs on 64-bit 体系结构

Lou*_*Lou 4 c# multithreading interlocked atomicity

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

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

    // 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
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*hie 5

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

不幸的Interlocked是,关于这些细节的文档仍然不完全符合标准。请参阅http://www.albahari.com/threading/part4.aspx,了解有关Interlocked操作中涉及的围栏的更多详细信息。