2013-12-13 77 views
4

它看起来像实施具有ReaderWriterLockSlim方法内没有MemoryBarrier电话。因此,当我在write lock内进行任何更改时,我可以在使用read lock的另一个线程中接收旧的缓存值。我是否需要使用ReaderWriterLockSlim的MemoryBarrier?

真的有可能吗?我应该在读写锁内的代码前后插入MemoryBarrier吗?

回答

5

看着(我的想法是)the mono source单声道ReaderWriterLockSlim是使用Interlocked调用实现的。

这些调用include a memory barrier on x86,所以你不应该需要添加一个。

+1

有一些CPU,可以有一个CAS没有记忆障碍,但他们是相当罕见的,我想即使他们有记忆障碍CAS形式,只是还没有CAS当你真的想在并发了极致。 –

2

正如Peter正确指出的那样,该实现的确引入了内存障碍,但并不明确。

更一般地说:C#语言规范要求某些副作用在锁定方面排序良好。虽然该规则仅适用于使用C#lock语句输入的锁,但自定义锁定基元的提供者使锁定对象不遵循相同规则将会非常奇怪。你明智的做法是仔细检查,但总的来说,你可以假设如果它是一个线程原语,那么它的设计就是确保重要的副作用在它周围是有序的。

相关问题