假设我有一个控制一些循环的执行现场:这是Thread.MemoryBarrier()的正确使用吗?
private static bool shouldRun = true;
而且我有一个线程在运行,有如下代码:
while(shouldRun)
{
// Do some work ....
Thread.MemoryBarrier();
}
现在,另一个线程可以设置shouldRun
到false
,而不使用任何同步机制。
据我了解Thread.MemoryBarrier(),在while循环中进行此调用将阻止我的工作线程获取shouldRun
的缓存版本,并有效防止发生无限循环。
是我关于Thread.MemoryBarrier正确的认识?鉴于我有可以设置shouldRun
变量(这个不能轻易改变),这是一种合理的方法,以确保我的循环会被任何线程停止一旦shouldRun
设置为false线程?
不声明布尔为挥发性做一样的东西?我不确定Thread.MemoryBarrier因此评论没有回答。例如http://www.albahari.com/threading/part4.aspxAnother>“解决此问题的更高级方法是将volatile关键字应用于_complete字段。volatile关键字指示编译器在每个字段上生成获取栅栏从该字段读取数据,并在每次写入该字段时释放一个篱笆“。问候, – 2012-01-04 15:38:02
挥发性是一个非常邪恶的事情,不应该使用:http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part -three.aspx – Steven 2012-01-04 15:41:45
大声笑,我没有意识到这一点!作为一名前C/asm程序员,我认为这是一件好事:)感谢您的链接,我会看看。 – 2012-01-04 15:46:18