任何人都可以在C#中对volatile关键字提供一个很好的解释吗?它解决了哪些问题,哪些问题没有解决?在哪些情况下它会节省我使用锁定?
假设我有一个非易失性的int字段,以及一个它Interlocked.Increment的线程.另一个线程可以直接安全地读取它,还是读取也需要互锁?
我以前认为我必须使用互锁读取来保证我看到当前值,因为毕竟,该字段不是易失性的.我一直在Interlocked.CompareExchange(int, 0, 0)努力实现这一目标.
但是,我偶然发现了这个答案,这表明实际的普通读取总会看到Interlocked.Incremented值的当前版本,并且因为int读取已经是原子的,所以不需要做任何特殊的事情.我还发现了Microsoft拒绝Interlocked.Read(ref int)请求的请求,进一步表明这完全是多余的.
那么我能真正安全地阅读这样一个int领域的最新价值Interlocked吗?
在C#中,我们知道a bool是原子的 - 那么为什么将它标记为有效volatile呢?有什么不同,什么是一个好的(甚至是实际的)用例?
bool _isPending;
Run Code Online (Sandbox Code Playgroud)
与
volatile bool _isPending; // Is this realistic, or insanity?
Run Code Online (Sandbox Code Playgroud)
我在这里和这里做了一些阅读,我正在努力确保我完全理解两者的内部运作.我想知道什么时候使用一个与另一个相比,或者只是bool足够.
Google快速搜索“内在属性c#”只会返回有关其他属性的文章,例如[Serializable]。显然,这些被称为“固有属性”。
但是,C#中也有一个本身被调用的属性,[Intrinsic]我试图弄清楚它到底是什么以及它如何工作。在.NET文档的“ 公共属性”页面上,或者据我所知,它在文档的其他任何地方都不存在。
该属性用于.NET核心的内部中的几个地方,例如,在将System.Numerics.Vectors文件夹,如Vector2_Intrinsics.cs。程式码片段:
[Intrinsic]
public Vector2(float x, float y)
{
X = x;
Y = y;
}
Run Code Online (Sandbox Code Playgroud) MSDN声明
将Volatile.Write Method (Double%, Double)作为原子操作吗?如果是这样如何保证?
Volatile.Write(ref mydouble, value);在一个线程和Volatile.Read(ref mydouble)另一个mydouble有double类型的地方做是否安全?
这是一般性问题.另一个问题 - 在这种特殊情况下我应该怎么做: