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)
是的,你是不必要的性能影响有关Interlocked,因为Interlocked不只是对值执行的原子操作,这也保证了价值可见的所有线程(顺序一致)。让我解释。在某些体系结构(包括某些 64 位体系结构)上,写入内存位置的值可能会被缓存以提高性能。尽管是原子操作,但简单地读取一个值可能不会读取另一个线程写入的“最新”值。 Interlocked还执行内存栅栏,以便栅栏之前的任何操作都将任何缓存值刷新到实际内存中。因此,虽然您可能会以微不足道的方式提高性能,但同时也会引入潜在的竞争条件。在这不是问题的架构上,Interlocked不会执行额外的工作并为您进行优化。
不幸的Interlocked是,关于这些细节的文档仍然不完全符合标准。请参阅http://www.albahari.com/threading/part4.aspx,了解有关Interlocked操作中涉及的围栏的更多详细信息。
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |