在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),但它无法正常工作。
答案 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/benefitting-power-and-performance-sleep-loops