锁定是否确保从缓存中刷新读取和写入?如果是这样,怎么样?

Gaz*_*yer 6 c# memory multithreading locking

我正在阅读这篇关于无锁线程同步的MSDN文章.这篇文章似乎推断,只要你在访问共享变量之前输入一个锁,那么这些变量将是最新的(至少在.Net 2.0中).

我想到这是怎么可能的?.Net中的锁只是所有线程在访问内存之前检查的任意对象,但锁本身并不知道正在访问的内存位置.

如果我有一个线程更新变量,甚至整个内存块,那么当进入/退出锁时,这些更新如何保证从CPU缓存中刷新?所有内存访问是否在锁内有效地变为易失性?

Pol*_*ity 6

检查Eric Lippert的工作:http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx

锁定保证锁内部读取或修改的内存一致,锁定保证一次只有一个线程访问给定的内存块,依此类推.

所以,是的,只要您在访问共享资源之前每次都锁定,您就可以非常确定它是最新的

编辑查看以下帖子以获取更多信息和非常有用的概述:http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/

  • 有趣的链接,谢谢.没有意识到所有的c#写都是不稳定的!第二个链接回答我的问题.内存访问在锁内不是易失性的,但是释放锁会刷新写入,并且获取锁会刷新读取缓存,因此值是最新的. (3认同)