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

Phi*_*gan 6 c++ multithreading c++11

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

std::this_thread::sleep_for(std::chrono::milliseconds(0));
std::this_thread::yield;
Sleep(0);  // On windows
Run Code Online (Sandbox Code Playgroud)

Dam*_*mon 7

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

这些放弃了当前的时间片并重新安排.SwitchToThread只考虑当前CPU上的线程,但没有关于调用线程在就绪队列中的位置的任何声明,除非在同一个CPU上有另一个线程就绪,首先运行.
sched_yield 将线程移动到就绪队列的末尾并重新安排.

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

nanosleep(timespec_with_zero_ns)(即在Linux/BSD/POSIX /之下)确实按照你的要求行事,它会在零时间内睡眠,即根本不睡觉.它只是一个无用的上下文切换,它立即返回(我们实际上已经发生了一次这种情况,当你认为它只是在Windows下工作时,这是令人惊讶的).


nea*_*eam 5

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

Sleep for:'阻止指定sleep_duration的当前线程的执行.可能会阻塞比sleep_duration更长的时间."

它实际上取决于实现和操作系统.

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