我正在尝试通过繁忙的旋转实现低延迟事件循环。但我不确定是否应该在循环中放入一个 std::this_thread::yield
。具体来说:
yield
如何“建议”重新安排?上下文切换实际发生的频率是多少?- 除了可能导致的上下文切换之外,主要的开销是什么?
最佳答案
Should I use std::this_thread::yield in a busy loop if the latency matters?
没有。如果系统繁忙,那么这可能会使您的线程停止相当长的时间,从而破坏您的延迟要求。
How does yield "suggest" a reschedule?
这取决于底层调度程序。通常,它会维护一个或多个要运行的线程队列;调用 yield
将当前线程放在队列的后面,然后激活该队列前面的线程。如果队列为空(即可运行线程数不多于处理器数),则让出线程将继续;否则,另一个线程将运行,让出线程将等待重新安排。
What's the main overhead except the context switch it may cause?
如果线程继续,则不会有上下文切换;只是系统调用的成本,以及一些摆弄调度程序队列的开销。
如果安排了另一个线程,则您必须等到您的线程被重新安排。这可能是 Not Acceptable ,具体取决于您的延迟要求。
关于c++ - 如果延迟很重要,我应该在繁忙的循环中使用 std::this_thread::yield 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709982/