c# 内存模型是否保证持有锁的线程可以看到所有执行的更新,而任何其他线程先前持有相同的锁?
我一直在阅读 c# 规范,但似乎无法找到这方面的细节。
c# 内存模型是否保证持有锁的线程可以看到所有执行的更新,而任何其他线程先前持有相同的锁?
我一直在阅读 c# 规范,但似乎无法找到这方面的细节。
寻求直观的解释:如果没有提供该保证,那么您将无法实现锁定。
寻求正式解释:CLI 规范(Ecma 335)第 I.12.6.5 章涵盖了这一点:
获取锁(System.Threading.Monitor.Enter 或进入同步方法)应隐式执行易失性读操作,释放锁(System.Threading.Monitor.Exit 或离开同步方法)应隐式执行易失性写操作.
易失性读取具有“获取语义”,这意味着读取保证发生在 CIL 指令序列中读取指令之后发生的任何对内存的引用之前。易失性写入具有“释放语义”,这意味着写入保证发生在 CIL 指令序列中写入指令之前的任何内存引用之后。
是的,受某些限制。有关详细信息,您要查找的部分是 3.10。
锁定只是暂停其他需要锁定的线程。这保证了只有一个线程执行对共享数据的更新。
当锁被释放时,另一个线程可以更新数据,它会看到前一个线程的更新。