6

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

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

2 回答 2

7

它们不是等价的。std::this_thread::yield应该分别映射到sched_yieldSwitchToThread。我说“应该”,因为如果取决于实施,当然。

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

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

nanosleep(timespec_with_zero_ns)(即在 Linux/BSD/POSIX/whatever 下)确实按照您的要求进行,它睡眠时间为零,即根本没有。它只是一个无用的上下文切换,会立即返回(我们实际上曾经发生过这种情况,当您假设它就像在 Windows 下一样工作时,您会感到惊讶)。

于 2012-06-15T11:12:09.257 回答
5

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

Sleep for: '在指定的 sleep_duration 内阻止当前线程的执行。阻塞时间可能超过 sleep_duration。'

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

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

于 2012-06-15T10:59:48.980 回答