放弃当前线程的时间片 C++

Giving up the time slice for current thread in C++

本文关键字:时间片 C++ 线程 前线 放弃      更新时间:2023-10-16

以下语句是否等效于放弃当前线程的时间片的方法?

std::this_thread::sleep_for(std::chrono::milliseconds(0));
std::this_thread::yield;
Sleep(0);  // On windows

它们不等效。 std::this_thread::yield应分别映射到sched_yieldSwitchToThread。我说"应该",因为当然,如果依赖于实现。

这些将放弃当前时间片并重新安排。 SwitchToThread只考虑当前 CPU 上的线程,但不声明调用线程在就绪队列中的位置,除非在同一 CPU 上准备好另一个线程,该线程首先运行
sched_yield线程移动到就绪队列的末尾并重新计划。

Sleep(0)在Windows下或多或少地做了同样的事情,除了它更不可靠(在50-100毫秒后返回Sleep(0)并非完全不可能!),并且它不尊重CPU边界,即在另一个CPU上运行的线程可能会被移动。"普通家庭"双核没有问题,NUMA 服务器上的大问题。

nanosleep(timespec_with_zero_ns)(即在Linux/BSD/POSIX/其他任何情况下)确实做到了你的要求,它休眠时间为零,即根本不会。它只是一个无用的上下文切换,会立即返回(我们实际上已经发生过一次这种情况,当您假设它只是像在 Windows 下一样工作时,这令人惊讶)。

http://en.cppreference.com/w/cpp/thread/sleep_for

睡眠时间:'阻止指定sleep_duration的当前线程的执行。可能会阻塞超过 sleep_duration 的时间。

这实际上取决于实现和操作系统。

std::this_thread::yield() 是放弃时间片的标准方法(依赖于非特定实现)。