我在 C# 中有一个轮询循环,平均需要每 100 微秒轮询一次 <EDIT>(当然,由于核心短缺,Windows 没有进行过多的抢占式线程上下文切换)</EDIT>。
由于没有时间重新安排,Sleep(1) 不会这样做。
所以我决定专用一个线程(实际上,在设置亲和力时,一个核心)并使用 Thread.SpinWait 为每次迭代的一组周期。虽然这很好用,但它消耗了不必要的电量。100 微秒足以让 CPU 暂停(但不足以让线程从调度程序中临时删除,因为 Windows 时间片会很长)。
相反,我正在考虑使用 Intel PAUSE 指令,但我不确定它是否会触发 Intel CPU 暂停硬件线程。英特尔声称它可以保存功率并且应该在自旋循环中使用,但由于暂停时间长达 100 微秒,我真的希望内核进入 C1 模式睡眠。
有任何想法吗?
编辑:我正在轮询第三方 API,因此没有要阻止的同步事件。