【发布时间】:2011-12-11 14:51:04
【问题描述】:
我正在阅读this MSDN article on lockless thread syncing。该文章似乎推断,只要您在访问共享变量之前输入锁,那么这些变量将是最新的(至少在 .Net 2.0 中)。
我开始思考这怎么可能? .Net 中的锁只是所有线程在访问内存之前检查的任意对象,但锁本身不知道正在访问的内存位置。
如果我有一个线程更新一个变量,甚至是整个内存块,当进入/退出锁时,如何保证这些更新从 CPU 缓存中刷新?是否所有内存访问都有效地在锁内变为易失性?
【问题讨论】:
-
这不是我有太多经验的领域,但为什么你访问的内存位置是否在 CPU 缓存中很重要。
-
@BenRobinson - 假设您有 2 个线程在不同的内核上运行,访问堆上的 1 个整数。在这种情况下,除非应用了适当的同步方法,否则每个线程都可能在本地内核的缓存中存储该值的副本。
标签: c# multithreading memory locking