为了实现多线程应用程序的无锁代码,我使用了volatile
变量,
理论上:该volatile
关键字仅用于确保所有线程都能看到 volatile 变量的最新值;因此,如果线程A
更新变量值并且线程B
在更新发生后立即读取该变量,它将看到最近从线程 A 写入的最新值。正如我在Nutshell书中的 C# 4.0 中读到的那样,这是不正确的,因为
应用 volatile 不会阻止交换写入后读取。
这个问题是否可以通过Thread.MemoryBarrier()
在每次获取volatile
变量之前解决,例如:
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
如果这解决了问题;考虑我们有一个 while 循环,该循环在其条件之一处依赖于该值;在while循环之前放置Thread.MemoryBarrier()
是解决问题的正确方法吗?例子:
private void A()
{
Thread.MemoryBarrier();
while (_someOtherConditions && _foo)
{
// do somthing.
}
}
更准确地说,我希望_foo
变量在任何线程随时要求它时提供其最新值;因此,如果Thread.MemoryBarrier()
在调用变量之前插入可以解决问题,那么我可以使用Foo
属性而不是在该属性的获取中_foo
执行 a就像:Thread.MemoryBarrier()
Foo
{
get
{
Thread.MemoryBarrier();
return _foo;
}
set
{
_foo = value;
}
}