0

在 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),但它不起作用。

4

4 回答 4

5

看看 C++11 的:

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

您的 CPU 可能支持_mm_pause()内在的(__asm__("pause")用于 gcc),这可能会或可能不会帮助您。

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

于 2013-02-02T18:58:36.070 回答
4

编辑以更直接地回答问题:您应该等待某些东西(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/

于 2013-05-29T22:10:14.327 回答
0

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

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

于 2013-02-02T18:41:33.563 回答
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/benefiting-power-and-performance-sleep-loops

于 2019-05-07T05:44:32.083 回答