我在一个特殊线程上使用Thread.SpinWait来创建一个接近精确的2ms延迟,最小的上下文切换机会,这是精确的硬件通信定时所需要的。但是使用分析器时,我注意到如果主线程执行超过100 as的任务,Thread.SpinWait也会这样做。我是不是误解了Thread.SpinWait的工作?它不是在调用它的线程上运行吗?
发布于 2022-07-21 13:06:20
首先,请读几遍:https://learn.microsoft.com/en-us/dotnet/standard/threading/spinwait
“如果它的旋转时间足够长(大约是内核转换所需的时间长度),它本身会启动上下文切换吗?”与“因为旋转块在所有线程上向前推进”(因此取决于可用的内核)相比,它的行为可能有所不同,但至少需要阻塞所有线程,就像您已经观察到的那样,它不能在锁定之前阻止,因此它必须等待任何它不能在所做的事情中冻结的东西,并且看起来需要额外的时间。
如果你需要每2毫秒做一件事情,考虑让定时器和ManualResetEvent一起计时,你可以让主线程在这个频率下执行,但是你不能让它在它得到cpu时间之前执行,所以当你的主线程正在做其他事情时,‘你’将不得不等待。
但是在我的操作中,想要控制从.net切换到上下文是个错误--它的级别太高了,就像@Charlieface一样,你必须获得特殊的硬件才能做到!
所以,本着“做正确的事情”的精神,也许退一步,考虑一下你想要做什么,如果这真的需要你控制硬件cpu上下文切换。
在.net中,对于非一般实现的等待,良好的大小至少需要16 ms,因为Task.Delay的最小大小正好在这一时间段内,然后您将等待该延迟。
我很容易就错了,但看起来你是在试图用一种有问题的方式实现你需要的解决方案,这样做是错误的,毕竟,我们是否真的想要阻止一个高性能的系统呢?
https://stackoverflow.com/questions/73057602
复制相似问题