gpt4 book ai didi

c# - Threading.Volatile.Read(Int64) 和 Threading.Interlocked.Read(Int64) 之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 21:48:22 26 4
gpt4 key购买 nike

.NET 系统类的 Read(Int64) 方法有何区别(如果有)System.Threading.VolatileSystem.Threading.Interlocked

具体而言,它们在 (a) 原子性和 (b) 内存排序方面各自的保证/行为是什么。

请注意,这是关于 Volatile 类的,不是volatile(小写)关键字。


MS 文档状态:

Volatile.Read Method

Reads the value of a field. On systems that require it, inserts a memory barrier that prevents the processor from reordering memory operations as follows: If a read or write appears after this method in the code, the processor cannot move it before this method.

...

Returns Int64

The value that was read. This value is the latest written by any processor in the computer, regardless of the number of processors or the state of processor cache.

对比

Interlocked.Read(Int64) Method

Returns a 64-bit value, loaded as an atomic operation.

特别令人困惑的是,Volatile 文档没有讨论原子性,而 Interlocked 文档没有讨论排序/内存屏障。

旁注:仅供引用:我更熟悉 C++ atomic API其中原子操作总是还指定内存排序语义。


question link (和传递链接)由 Pavel 提供很好地解释了 volatile-as-in-memory-barrier 和 atomic-as-in-no-torn-reads 的差异/正交性,但它们没有解释这两个概念如何应用于这两个类。

  • Volatile.Read 是否对原子性做出任何保证?
  • Interlocked.Read(或者,实际上,任何 Interlocked 函数)是否对内存顺序做出任何保证?

最佳答案

Interlocked.Read translates into a CompareExchange operation :

public static long Read(ref long location)
{
return Interlocked.CompareExchange(ref location, 0, 0);
}

因此它具有 CompareExchange 的所有优点:

  • 完整的内存屏障
  • 原子性
另一方面,

Volatile.Read 仅获取语义。它可以帮助您确保读取操作的执行顺序,而无需任何原子性或新鲜度保证。

关于c# - Threading.Volatile.Read(Int64) 和 Threading.Interlocked.Read(Int64) 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57507457/

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