gpt4 book ai didi

c# - 对Volatile.Read/Write的理解

转载 作者:可可西里 更新时间:2023-11-01 08:25:56 24 4
gpt4 key购买 nike

我正在尝试了解 C# Volatile 类。

正如我所读:

  • Volatile.Write 方法强制写入 location 中的值到通话点。此外,任何较早的程序顺序加载和存储必须在调用 Volatile.Write 之前发生。

  • Volatile.Read 方法强制读取 location 中的值在通话时。此外,任何以后的程序顺序加载和存储必须发生在调用 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);
}
}

在开始写入 m_flag 之前,CPU 会等待 Volatile.Write(ref m_flag, 1); 之前的命令吗?

这对线程同步有何帮助?

最佳答案

the cpu will wait for the commands before Volatile.Write(ref m_flag, 1); before starting to write to m_flag?

呃,有点。更好的表达方式是:保证如果任何其他线程看到 m_flag 设置为 1,它们也会看到 m_value 设置为 5。

And how is that helps the threads synchronization?

我不会说它有助于同步 - 但它确实有助于实现正确性。

如果你没有使用 volatile 读/写,编译器/运行时/cpu 可能会重新排序 Thread1 方法中的两条指令,程序将能够打印0、5 或什么都没有。

对于不稳定的读/写,程序将打印 5 或什么都不打印,但从不 0。这是预期的行为。

关于c# - 对Volatile.Read/Write的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24307096/

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