kyl*_*leb 14 c# multithreading c#-4.0
c#中的单个旋转多长时间?我想知道的是有一个具有spinCount参数的ManualResetEventSlim,我想知道每次旋转的时间是多少,或者它是如何工作的?我知道,对于短等待而言,旋转比内核等待更有效.所以我只是想看看我应该为这个通常需要2-10秒的工作设置这个值.
Bri*_*eon 29
spinCount构造函数中的参数与执行旋转等待所花费的毫秒数之间没有相关性.
下面是它的工作原理.MRES使用此spinCount参数独立于其自己的等待例程Thread.SpinWait.
Thread.Yield和之间交替Thread.SpinWait.调用以Thread.SpinWait旋转开始,Environment.ProcessorCount * 4然后在每次连续调用时大约加倍.Thread.Sleep(1).Thread.Sleep(0).Thread.Yield被叫.CancellationToken在100后每10次迭代检查.所以你可以看到MRES的定制旋转程序中有一个相当复杂的歌舞.并且算法可以从版本更改为版本.实际上没有办法预测每次旋转会持续多长时间.
如果您的典型等待时间是2-10秒,那么您的代码几乎肯定会通过协调进行内核级别等待Monitor.Wait,Monitor.Pulse因为spinCount参数限制为2047.
另外,2-10秒是很长一段时间.你真的想旋转那么久吗?
hat*_*ica 12
旋转计数意味着很小.默认值为10(如果在单个处理器上运行,则为1).如果使用,可以让你指定自旋计数的构造,允许最大为2047如果未通知的事件非常快,ManualResetEventSlim采用了常规的事件句柄的等待.正如@HenkHolterman所说,所涉及的时间远远小于秒.我们说的是周期,而不是几秒甚至几毫秒.
http://msdn.microsoft.com/en-us/library/5hbefs30.aspx
在.NET Framework版本4中,您可以使用System.Threading.ManualResetEventSlim类,以便在预期等待时间非常短且事件未跨越进程边界时获得更好的性能.ManualResetEventSlim在等待事件发出信号时短时间使用忙碌旋转.当等待时间很短时,旋转可以比等待使用等待句柄便宜得多.但是,如果事件未在特定时间段内发出信号,则ManualResetEventSlim将转向常规事件句柄等待.
http://msdn.microsoft.com/en-us/library/ee722114.aspx
在多核计算机上,当预计资源不会被长时间保持时,等待线程在用户模式下旋转几十个或几百个周期会更有效,然后重试获取资源.如果资源在旋转后可用,那么您已经保存了数千个周期.如果资源仍然不可用,那么您只花了几个周期,仍然可以进入基于内核的等待.
编辑:直接回答你的问题,单个旋转的时间长度无法明确回答,因为它取决于它运行的硬件. http://msdn.microsoft.com/en-us/library/system.threading.thread.spinwait(v=vs.95).aspx
SpinWait本质上将处理器置于一个非常紧密的循环中,循环计数由iterations参数指定.因此,等待的持续时间取决于处理器的速度.