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

时间:2012-06-15 10:09:03

标签: c++ multithreading c++11

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

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

2 个答案:

答案 0 :(得分:7)

他们不等同。 std::this_thread::yield应分别映射到sched_yieldSwitchToThread。我说“应该”,因为如果依赖于实施,当然。

这些放弃了当前的时间片并重新安排。 SwitchToThread仅尊重当前CPU上的线程,但如果在同一个CPU上有另一个线程准备好,那么首先运行时,除了之外,不会对就绪队列中的调用线程的位置做出任何声明。
sched_yield 将线程移动到就绪队列的末尾并重新安排。

在Windows下,

Sleep(0)或多或少相同,除了它更不可靠(在50-100ms之后让Sleep(0)返回根本不可能!)并且它不尊重CPU边界,即一个可以在另一个CPU上运行的线程可能会被移动。关于NUMA服务器上的“普通家庭”双核,大问题没有问题。

nanosleep(timespec_with_zero_ns)(即在Linux / BSD / POSIX /之下)确实按照你的要求行事,它睡眠时间为零,即完全没有。它只是一个无用的上下文切换,它立即返回(我们实际上曾经发生过这种情况,当你假设它只是在Windows下工作时,这是令人惊讶的。)

答案 1 :(得分:5)

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

睡觉: '阻止指定sleep_duration的当前线程的执行。 阻止时间超过sleep_duration。'

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

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