Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 放弃CPU时间_C++_C_Cpu - Fatal编程技术网

C++ 放弃CPU时间

C++ 放弃CPU时间,c++,c,cpu,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. } 我尝试了Sleep0,但它不起作用。sched_yield会导致调用线程放弃CPU 看看C++11: #include <thre

在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.
}

我尝试了Sleep0,但它不起作用。

sched_yield会导致调用线程放弃CPU

看看C++11:

#include <thread>
std::this_thread::yield();
您的CPU可能支持gcc的_mm_pause intrinsive uu asm_upause,这可能对您有帮助,也可能没有帮助

否则,您将看到特定于操作系统的功能:
Linux上的pthreads的sched_yield,或Windows上的SwitchToThread编辑以更直接地回答这个问题:您应该等待WaitForSingleObject或GetMessage或类似的东西,或者,如果没有事件,您可以等待非零毫秒数的睡眠

Sleep0通常会立即返回,因此您仍然会消耗大量能量,耗尽用户的电池或提高他们的电费。Sleep1仍然是一个黑客,但它比Sleep0、暂停、sched_屈服或SwitchToThread好很多数量级

如果有一个线程正在等待运行,Windows上的Sleep0将让位于另一个具有相同优先级的线程。这很少有用,因为特别是在动态调整线程优先级的情况下,您永远无法判断是否有其他具有相同优先级的线程。Sleep0通常不会切换到优先级更高的线程,因为优先级更高的线程已经在运行了。它不会切换到优先级较低的线程,因为它不会。SwitchToThread也有类似的问题

_mm_pause告诉CPU空闲几个周期。这降低了功耗,并且在超线程机器上可以让该核心上的另一个线程运行得更快。然而,这不是你通常应该做的事情

如果您想在n毫秒内醒来,请拨打Sleepn。或者,更好的是,等待一个特定的事件

像sched_yield、Sleep0和SwitchToThread这样的函数通常都是坏主意,因为它们不会告诉操作系统何时需要再次运行

无论你做什么,不要忙着等待,即使是暂停。

仅供参考,英特尔发布了两个关于如何做你想做的事情的最佳实践,这主要是通过使用“暂停”来实现的。请注意,他们的gen 6等待周期时间已故意增加,因此您需要的是以下文章中所述内容的组合:


你想达到什么目标?在没有繁忙循环的情况下睡眠一段特定时间?Sleep0可以工作,但要做很多事情,必须有其他线程准备运行。如果刚刚调用Sleep的线程是唯一一个读来运行的线程,那么它将立即重新调度/运行。这可能是一种依赖于操作系统的行为。在Win32中,可以使用事件对象让线程等待,但这需要另一个线程发出事件信号。不确定这是否有帮助。看到睡眠有什么问题了吗?不要循环。按所需的时间睡觉。这些技术都不会让计算机进入空闲状态_暂停只是告诉机器转得慢一点。sched_yield和SwitchToThread以及Sleep0没有指定线程应该产生多长时间,并且很可能会立即调度线程,特别是在多核系统上。最好的答案是你应该等待一些事情——操作系统有一组丰富的原语,让你等待事情发生。如果做不到这一点,可以使用非零延迟调用Sleep或等效的posix函数,这样就不会旋转和浪费电源。re:pause:sched_yield是编写多线程代码的糟糕方法。从sched_yield的文档中,如果调用线程是当时最高优先级列表中的唯一线程,那么它将在调用sched_yield后继续运行。这是一种非常常见的情况。如果你在一个循环中调用sched_yield,那么你只是有一个更复杂的自旋循环,你在浪费CPU时间和电力。不要。等等。C++11具有便携式精确睡眠功能。另请参见TL:DR如果您想要睡眠,请使用名为sleep的函数。但正如你所说,这并不是说睡眠是一种不好的睡眠方式,而是等待事件而不是短时间的睡眠要好得多。顺便说一句,Skylake上的停顿时间约为100个周期,而此前Sandybridge家族的停顿时间约为5个周期。