据我所知,同步原语的精简版本在使用内核资源之前使用旋转等待。spinCount = 0时的ManualResetEventSlim与通常的ManualResetEvent相同,这是真的吗?
spinCount
ManualResetEventSlim
ManualResetEvent
new ManualResetEventSlim(initialState: false, spinCount: 0);
如果没有,它们之间的本质区别是什么?我们使用没有旋转等待的瘦版本有什么好处吗?
uemypmqf1#
查看Wait的源代码,如果您将旋转计数设置为0,那么它基本上是一个ManualResetEvent,但它实际上使用了一个监视器,而不是使用内核等待事件。内核等待事件只有在您显式请求它时才被分配,这保存了到内核模式的转换以分配它并设置/重置它。值得考虑的是,尽管如果将旋转计数设置为0,ManualResetEventSlim不会旋转,但对Monitor.Wait的调用很可能会旋转,因此我怀疑您实际上并没有避免旋转。
Monitor.Wait
1条答案
按热度按时间uemypmqf1#
查看Wait的源代码,如果您将旋转计数设置为0,那么它基本上是一个
ManualResetEvent
,但它实际上使用了一个监视器,而不是使用内核等待事件。内核等待事件只有在您显式请求它时才被分配,这保存了到内核模式的转换以分配它并设置/重置它。
值得考虑的是,尽管如果将旋转计数设置为0,
ManualResetEventSlim
不会旋转,但对Monitor.Wait
的调用很可能会旋转,因此我怀疑您实际上并没有避免旋转。