看起来单声道实现在MemoryBarrier
方法中没有ReaderWriterLockSlim
次调用。因此,当我在write lock
中进行任何更改时,我可以在另一个使用read lock
的线程中接收旧的缓存值。
真的有可能吗?我应该在代码读取和写入锁定之前和之后插入MemoryBarrier
吗?
答案 0 :(得分:5)
查看(我认为是)the mono source, Mono ReaderWriterLockSlim
是使用Interlocked
调用实现的。
这些来电include a memory barrier on x86,所以您不需要添加一个。
答案 1 :(得分:2)
正如Peter正确指出的那样,实现确实引入了一个内存障碍,而不是明确的。
更一般地说:C#语言规范要求在锁定方面有一定的副作用。虽然该规则仅适用于使用C#lock
语句输入的锁,但对于自定义锁定基元的提供程序来说,制作不遵循相同规则的锁定对象会非常奇怪。你应该仔细检查,但一般来说你可以假设,如果它是一个线程原语,那么它的设计是为了确保重要的副作用在它周围有序。