ManualResetEvent(Slim),Semaphore(Slim)和ReaderWriterLock(Slim)的使用和实现方式的差异

Geo*_*ett 15 c# multithreading .net-4.0

使用.net 4.0,添加了几个与线程相关的新类:ManualResetEventSlim,SemaphoreSlimReaderWriterLockSlim.

Slim版本和旧版本之间有什么区别,什么时候应该使用其中一个?

Ric*_*ett 17

ReaderWriterLockSlim是一个更好的版本ReaderWriterLock更快,并没有遭受作家饥饿

ManualResetEventSlim并且SemaphoreSlim是a的完全托管版本,ManualResetEvent并且Semaphore在回退到内核对象之前等待一段时间,因此当等待时间很短时,它比旧版本更快.

  • 请注意,如果等待时间足够长,则ManualResetEventSlim和SemaphoreSlim**将创建内核对象. (4认同)
  • 使用超薄版本的等待时间非常重要.如果等待时间很长,你应该使用较旧的(胖)版本. (3认同)
  • +1:是的,我自己的个人测试表明RWL比普通的"锁定"慢了15倍.较新的RWLS改进了这一点,但它仍然可以慢5倍.当然,每个人的里程都会有所不同. (2认同)
  • 我刚做了一些*准确*测试.看起来RWL比`lock`慢约5倍,而RWLS慢约​​2倍.所以RWLS确实改进了很多东西.是的,读写器锁肯定比普通的旧锁具有优势:) (2认同)

Nie*_*ter 10

以下是一些很好的插图,解释了这些同步原语的" 流程 ".这些可能有助于更具体地理解这些术语(摘自本博客)


小智 7

ManualResetEventSlimSemaphoreSlim是其内核对应项的轻量级版本,除非调用它们的属性,否则不会分配任何内核对象WaitHandle

当调用 Wait 时,这些类型不会直接阻塞,而是在阻塞之前短暂旋转,以防收到信号

ManualResetEventSlim构造函数可以SpinCount在阻塞之前自定义 spns 的数量

这两种类型都支持取消,您可以将 CancellationToken 传递给 Wait 方法

SemaphoreSlim公开了不公开的CurrentCount属性Semaphore

ManualResetEventSlim拥有一个没有的IsSet属性ManualResetEvent


Jam*_*iec 5

直接引用文档

“在.NET Framework版本4中,可以使用System.Threading.ManualResetEventSlim类在预期等待时间很短且事件未跨越进程边界时获得更好的性能”