如果延迟很重要,我应该在繁忙循环中使用std::this_thread::yield吗

Should I use std::this_thread::yield in a busy loop if the latency matters?

本文关键字:std this yield thread 循环 延迟 我应该 如果      更新时间:2023-10-16

我正在尝试实现一个具有繁忙旋转的低延迟事件循环。但我不确定是否应该在循环中放入std::this_thread::yield。具体而言:

  1. yield如何"建议"重新安排?上下文切换实际发生的频率是多少
  2. 除了可能导致的上下文切换之外,主要开销是什么

如果延迟很重要,我应该在繁忙循环中使用std::this_thread::yield吗?

否。如果系统繁忙,那么线程可能会停止相当长的一段时间,从而打破延迟要求。

yield如何"建议"重新安排?

它取决于底层调度程序。通常,它维护一个或多个要运行的线程队列;调用yield将当前线程放在队列的后面,然后激活该队列前面的线程。如果队列是空的(即,可运行线程的数量不超过处理器的数量),则让步线程将继续;否则,另一个线程将运行,而产生的线程将等待重新调度。

除了可能导致的上下文切换之外,主要开销是什么?

如果线程继续,将不会进行上下文切换;只是系统调用的成本,以及对调度器队列的一些篡改。

如果安排了另一个线程,那么您将不得不等到您的线程被重新安排。这可能是不可接受的,具体取决于您的延迟要求。

相关文章: