2

c# 内存模型是否保证持有锁的线程可以看到所有执行的更新,而任何其他线程先前持有相同的锁?

我一直在阅读 c# 规范,但似乎无法找到这方面的细节。

4

3 回答 3

7

寻求直观的解释:如果没有提供该保证,那么您将无法实现锁定。

寻求正式解释:CLI 规范(Ecma 335)第 I.12.6.5 章涵盖了这一点:

获取锁(System.Threading.Monitor.Enter 或进入同步方法)应隐式执行易失性读操作,释放锁(System.Threading.Monitor.Exit 或离开同步方法)应隐式执行易失性写操作.

易失性读取具有“获取语义”,这意味着读取保证发生在 CIL 指令序列中读取指令之后发生的任何对内存的引用之前。易失性写入具有“释放语义”,这意味着写入保证发生在 CIL 指令序列中写入指令之前的任何内存引用之后。

于 2013-01-23T05:22:19.417 回答
3

是的,受某些限制。有关详细信息,您要查找的部分是 3.10。

于 2013-01-23T05:01:27.753 回答
1

锁定只是暂停其他需要锁定的线程。这保证了只有一个线程执行对共享数据的更新。

当锁被释放时,另一个线程可以更新数据,它会看到前一个线程的更新。

于 2013-01-23T04:56:37.203 回答