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

标签 c++ c++11

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

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

最佳答案

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/

相关文章:

c++ - 涉及 boost::thread 的奇怪崩溃

c++ - 条件变量 C++ Windows

c++ - 如何检查参数包中的每种类型是否唯一?

c++ - g++ 和 c++0x 规范支持

c++ - 使用 boost::bind 结果作为参数

java - errno 相对于 java 异常的优势

c++ - SPSS 15 I/O DLL : Modifying Existing Cases

c++ - std::uniform_real_distribution<double>(0,1) 能否返回大于 0.99999999999999994 的值?

c++ - boost::split 返回 sep 字符

c++ - 我可以有一个 lambda 的 boost 无锁队列吗?