在 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.
}
我试过 Sleep(0),但它不起作用。
看看 C++11 的:
#include <thread>
std::this_thread::yield();
您的 CPU 可能支持_mm_pause()
内在的(__asm__("pause")
用于 gcc),这可能会或可能不会帮助您。
否则,您将查看特定于操作系统的功能:
sched_yield()
Linux 或SwitchToThread()
Windows上的 pthreads
编辑以更直接地回答问题:您应该等待某些东西(WaitForSingleObject 或 GetMessage 或类似的东西),或者,如果没有事件可以等待 Sleep 一些非零毫秒数。
Sleep(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/
sched_yield() “导致调用线程放弃 CPU。”
http://www.kernel.org/doc/man-pages/online/pages/man2/sched_yield.2.html
仅供参考,英特尔发布了两个关于如何做你想做的事的最佳实践,主要是通过使用_mm_pause()
. 请注意,他们的第 6 代等待周期时间已故意增加,因此您需要结合以下文章中描述的内容:
https://software.intel.com/en-us/articles/benefiting-power-and-performance-sleep-loops