首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.SpinWait似乎受到主线程的影响。

Thread.SpinWait似乎受到主线程的影响。
EN

Stack Overflow用户
提问于 2022-07-20 20:11:19
回答 1查看 27关注 0票数 -1

我在一个特殊线程上使用Thread.SpinWait来创建一个接近精确的2ms延迟,最小的上下文切换机会,这是精确的硬件通信定时所需要的。但是使用分析器时,我注意到如果主线程执行超过100 as的任务,Thread.SpinWait也会这样做。我是不是误解了Thread.SpinWait的工作?它不是在调用它的线程上运行吗?

EN

回答 1

Stack Overflow用户

发布于 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的最小大小正好在这一时间段内,然后您将等待该延迟。

我很容易就错了,但看起来你是在试图用一种有问题的方式实现你需要的解决方案,这样做是错误的,毕竟,我们是否真的想要阻止一个高性能的系统呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73057602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档