gpt4 book ai didi

c# - 如果我调用 Thread.Join() 是否需要 volatile?

转载 作者:太空狗 更新时间:2023-10-29 23:20:58 25 4
gpt4 key购买 nike

在 Java 中,如果您仅在加入改变它的线程后才访问它,则该字段不需要是可变的;连接强制执行发生在关系之前。

在 C# 中呢?使用以下代码,我是否可以保证在调用 Join() 后看到 _value 的更新值,或者我是否需要使 _value 可变?

private String _value = "FOO"

public void Foo()
{

Thread myThread = new Thread(Bar);
myThread.Start();
myThread.Join();
Console.WriteLine("[Main Thread] _val = "+ _value);

}

public void Bar()
{

for(int i=0; i<1000; i++)
{
Console.WriteLine("Looping");

if(i==75)
{
_value="BAR";
}
}
Console.WriteLine("DONE Looping");
}

在我的代码片段中,“BAR”总是会被打印出来吗?

最佳答案

首先:我的一般经验法则是,如果我问的是“这是否需要波动?”那么我对内存模型的理解不够好,无法编写低锁代码。

如果没有非常充分的理由和专家的建议,就把东西锁起来,不要尝试低锁代码。

我不是这样的专家。我对 C# 内存模型知之甚少,无法自信地编写低锁代码,如果在弱内存模型硬件上运行它会是正确的。

解决您的实际问题:

am I guaranteed to see the updated value of _value after calling Join() or do I need to make _value volatile ?

您的问题的答案在 C# 规范中,为方便起见,我在这里引用它:

Execution of a C# program proceeds such that the side effects of each executing thread are preserved at critical execution points. A side effect is defined as a read or write of a volatile field, a write to a non-volatile variable, a write to an external resource, and the throwing of an exception. The critical execution points at which the order of these side effects must be preserved are references to volatile fields, lock statements, and thread creation and termination.

您有一个对非 volatile 变量的写入,并且线程在连接返回时结束,因此必须在连接点保留写入的副作用。

关于c# - 如果我调用 Thread.Join() 是否需要 volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37685945/

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