如果延迟很重要,我应该在繁忙循环中使用std::this_thread::yield吗
Should I use std::this_thread::yield in a busy loop if the latency matters?
我正在尝试实现一个具有繁忙旋转的低延迟事件循环。但我不确定是否应该在循环中放入std::this_thread::yield
。具体而言:
yield
如何"建议"重新安排?上下文切换实际发生的频率是多少- 除了可能导致的上下文切换之外,主要开销是什么
如果延迟很重要,我应该在繁忙循环中使用std::this_thread::yield吗?
否。如果系统繁忙,那么线程可能会停止相当长的一段时间,从而打破延迟要求。
yield如何"建议"重新安排?
它取决于底层调度程序。通常,它维护一个或多个要运行的线程队列;调用yield
将当前线程放在队列的后面,然后激活该队列前面的线程。如果队列是空的(即,可运行线程的数量不超过处理器的数量),则让步线程将继续;否则,另一个线程将运行,而产生的线程将等待重新调度。
除了可能导致的上下文切换之外,主要开销是什么?
如果线程继续,将不会进行上下文切换;只是系统调用的成本,以及对调度器队列的一些篡改。
如果安排了另一个线程,那么您将不得不等到您的线程被重新安排。这可能是不可接受的,具体取决于您的延迟要求。
相关文章:
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 怎么可能写 f( *this, std::forward<Args>(args)... ) 而 f 只用 F f 声明;
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- 从自身内部替换 std::函数(通过将移动赋值到 *this?)
- C++错误:将"const umap_int {aka const std::unordered_map<int, int>}"作为"this"参数会丢弃限定符 [-permissive]
- 'std::out_of_range' what(): vector::_M_range_check: __n (即 0) >= this->size() (即 0)
- const std::unordered_map<char, int>' 因为 'this' 参数会丢弃 lambda 中的限定符
- "The C++ Library doesen't provide a hash for this type." - 在 std::unordered_map 中使用自己的类
- Lambda 捕获'this'另存为 std::function
- 成员函数与 std::move(*this) 的行为差异
- std::reference_wrapper around *this
- 为什么我不能std :: partition this std :: unordered_map
- How to std::forward( *this )
- std::remove_if 将“const type”作为“this”参数传递会丢弃 Linux 上的限定符
- 使用"this"指针初始化 std::array
- 如何在 std:ostream& Member 中正确使用,而"this"是一个 const?
- std::bind, this and QtConcurrent
- STD 向量 push_back' : 2 个重载对"this"指针错误没有合法转换
- C++11线程等待行为:std::this_Thread::yield()与std::this _Thread::sle