给定以下类:
class C
{
public int x = 0;
public void F() {
new Thread(G).Start();
while (x == 0) { Thread.Sleep(TimeSpan.FromMilliseconds(1)); }
}
public void G() {
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
Interlocked.Exchange(ref x, 1);
}
}
我假设 C#
标准允许 new C().F()
永远运行是的,因为没有什么可以强制 F( )
每次访问从主内存中检索 x
的值。 Interlocked.Exchange
这里甚至没有帮助,因为 F()
没有看到 G()
的实现,所以可能会优化掉从主存储器访问。
这个分析是否正确?
此外,我知道让 x
变易变会解决这个问题,但是还有什么其他方法可以解决这个问题吗?
最佳答案
使用 lock
语句强制其他线程等待它解锁。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
关于c# - 确保从不同的读取线程看到写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55219407/