gpt4 book ai didi

c# - SpinWait 与 sleep 等待。使用哪一个?

转载 作者:IT王子 更新时间:2023-10-29 03:42:43 28 4
gpt4 key购买 nike

是否有效

SpinWait.SpinUntil(() => myPredicate(), 10000)

超时为 10000 毫秒

同样的条件使用Thread.Sleep轮询是否效率更高例如,类似于以下 SleepWait 函数的内容:

public bool SleepWait(int timeOut)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut)
{
Thread.Sleep(50)
}
return myPredicate()
}

我担心如果我们谈论超过 1 秒的超时,SpinWait 的所有产生可能不是一个好的使用模式?这是一个有效的假设吗?

您更喜欢哪种方法,为什么?还有其他更好的方法吗?


更新 - 变得更具体:

有没有办法让 BlockingCollection Pulse 在达到限制容量时成为休眠线程?正如 Marc Gravel 建议的那样,我宁愿避免忙碌的等待。

最佳答案

在 .NET 4 中,SpinWait 在屈服之前执行 CPU 密集型旋转 10 次迭代。但它不会在每个周期后立即返回给调用者;相反,它调用 Thread.SpinWait 通过 CLR(本质上是操作系统)在设定的时间段内自旋。这个时间段最初是几十纳秒,但每次迭代都会加倍,直到 10 次迭代完成。这使得旋转(CPU 密集型)阶段花费的总时间清晰/可预测,系统可以根据条件(核心数量等)进行调整。如果 SpinWait 处于自旋让步阶段的时间过长,它将周期性休眠以允许其他线程继续进行(有关更多信息,请参见 J. Albahari's blog)。这个过程保证让核心保持忙碌......

因此,SpinWait 将 CPU 密集型自旋限制为一定数量的迭代,之后它会在每次自旋时产生其时间片(通过实际调用 Thread.YieldThread.Sleep),降低其资源消耗。它还将检测用户是否正在运行单核机器,如果是的话,在每个周期都产生。

Thread.Sleep 线程被阻塞。但是这个过程在 CPU 方面不会像上面那样昂贵。

关于c# - SpinWait 与 sleep 等待。使用哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9719003/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com