【发布时间】:2014-08-10 00:29:57
【问题描述】:
我正在尝试理解 C# Volatile 类。
如我所见:
Volatile.Write方法强制写入 location 中的值 到通话点。此外,任何早期的程序顺序 加载和存储必须在调用 Volatile.Write 之前发生。Volatile.Read方法强制读取位置中的值 在通话点。此外,任何以后的程序顺序加载 并且存储必须在调用 Volatile.Read 之后发生。
这是否意味着在以下情况下:
internal sealed class ThreadsSharingData {
private Int32 m_flag = 0;
private Int32 m_value = 0;
// This method is executed by one thread
public void Thread1() {
// Note: 5 must be written to m_value before 1 is written to m_flag
m_value = 5;
Volatile.Write(ref m_flag, 1);
}
// This method is executed by another thread
public void Thread2() {
// Note: m_value must be read after m_flag is read
if (Volatile.Read(ref m_flag) == 1)
Console.WriteLine(m_value);
}
}
cpu 会等待Volatile.Write(ref m_flag, 1); 之前的命令,然后再开始写入m_flag?
这对线程同步有何帮助?
【问题讨论】:
-
它仅与内存模型较弱的处理器相关,即获取和释放语义很重要的处理器。除了ARM内核之外,剩下的很少。它不是正确同步的替代品,编写没有同步的线程安全代码是一个非常先进的概念。否则,this question 已经很好地涵盖了。
标签: c# volatile thread-synchronization