放弃CPU时间

时间:2013-02-02 18:37:37

标签: c++ c cpu

在C / C ++中是否可以放弃"放弃"线程的CPU时间? 例如:

void wait(int s) //Low cpu usage
{
 int tmp = time();
 while(tmp + CLOCKS_PER_SEC * s > time())
  __AbandonCPUTime();
  //Tell cpu to do sth else.
}

我已经尝试过睡眠(0),但它无法正常工作。

4 个答案:

答案 0 :(得分:3)

看看C ++ 11:

#include <thread>
std::this_thread::yield();

您的CPU可能支持_mm_pause()固有内容(gcc __asm__("pause")),这可能对您有所帮助,也可能没有帮助。

否则您将查看特定于操作系统的功能: sched_yield()用于Linux上的pthreads,或SwitchToThread()在Windows上

答案 1 :(得分:3)

编辑以更直接地回答问题:您应该等待某事(WaitForSingleObject或GetMessage或某些等效物),或者,如果没有事件可以等待Sleep一些非零的毫秒数。< / p>

睡眠(0)通常会立即返回,因此您仍然会消耗大量能量并耗尽用户的电量或增加电费。 Sleep(1)仍然是一个hack但它比Sleep(0),_ mm_pause(),sched_yield()或SwitchToThread()好几个数量级。

如果有一个等待运行的线程,Windows上的

Sleep(0)将产生相同优先级的另一个线程。这很少有用,因为特别是在动态调整线程优先级时,您永远无法判断是否存在具有相同优先级的另一个线程。 Sleep(0)通常不会切换到更高优先级的线程,因为该线程(优先级更高)已经在运行。并且它不会切换到优先级较低的线程,因为它不会。 SwitchToThread有类似的问题。

_mm_pause()告诉CPU空闲几个周期。这样可以降低功耗,而在超线程计算机上可以让该核心上的其他线程运行得更快。但是,这不是你通常应该做的事情。

如果要在n毫秒内唤醒,请调用Sleep(n)。或者,更好的是,等待特定事件。

sched_yield,Sleep(0)和SwitchToThread等函数通常都是错误的想法,因为它们不会告诉操作系统何时再次运行。

无论你做什么都不要等待,即使是_mm_pause。 http://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

答案 2 :(得分:0)

sched_yield()“导致调用线程放弃CPU。”

http://www.kernel.org/doc/man-pages/online/pages/man2/sched_yield.2.html

答案 3 :(得分:0)

仅供参考,英特尔已经发布了两种有关如何做所需的最佳实践,并且大多数情况下是通过使用_mm_pause()来完成的。请注意,他们的第6代等待周期时间有意增加了,因此您需要的是以下文章中描述的内容的组合:

https://software.intel.com/en-us/articles/a-common-construct-to-avoid-the-contention-of-threads-architecture-agnostic-spin-wait-loops

https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loops