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

Aft*_*ess 5 c# concurrency volatile

在Java中,如果只在加入突变它的线程后才访问它,则字段不需要是volatile; 联接在关系之前强制执行.

在c#怎么样?使用下面的代码,我保证在调用Join()之后会看到_value的更新值,或者我是否需要使_value变为volatile?

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");
}
Run Code Online (Sandbox Code Playgroud)

在我的代码片段中,是否会打印"BAR"?

usr*_*usr 1

常见的线程同步操作执行完整的内存屏障。开始、加入和结束线程肯定是其中之一。没有它,各种程序都会出现故障。

这些保证通常没有记录在案,但实际上是显而易见的。唉,我无法提供确凿的证据,只能说其他任何事情都是疯狂的。

将此列表视为证据,表明这没有得到很好的记录,并且您正在寻找的财产很可能持有。

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

是的。我相信所有专家都会同意这一点。这是一个更简单的代码示例,它表达了同样的观点:

int x = 0;
Thread myThread = new Thread(() => x = 1);
myThread.Start();
myThread.Join();
x = 2;
Console.WriteLine(x); //Prints 2 because of memory barriers on exit and on Join.
Run Code Online (Sandbox Code Playgroud)