题
最近,我一直在C ++上编写一个程序,该程序pings三个不同的网站,然后根据通行证或失败,它将等待5分钟或30秒,然后再尝试。
目前,我一直在使用CTIME库和以下功能来处理我的等待。但是,根据我的CPU计,这是一个不可接受的解决方案。
void wait (int seconds)
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC;
while (clock () < endwait) {}
}
该解决方案不可接受的原因是,根据我的CPU计,该程序在等待时,该程序的运行量为48%至50%。我有一个Athlon 64 x2 1.2 GHz处理器。我的谦虚130线程序甚至不应该获得50%的范围。
如何编写等待功能更好,以便仅使用最少的资源?
解决方案
要保持便携式您可以使用 boost ::线程 睡觉:
#include <boost/thread/thread.hpp>
int main()
{
//waits 2 seconds
boost::this_thread::sleep( boost::posix_time::seconds(1) );
boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );
return 0;
}
其他提示
使用C ++ 11标准,可以使用以下方法:
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::seconds(100));
或者 sleep_until
可用于。
采用 睡觉 而不是循环时空的。
只是要解释发生的事情:当您调用clock()您的程序再次检索时间:您要它尽可能快地做到这一点,直到达到末期...它使运行程序的CPU核心“旋转” “尽可能快地通过您的循环,阅读数百万次的时间,希望它能滚动到末日。相反,您需要告诉操作系统您想在间隔后醒来...然后他们可以暂停您的程序并让其他程序运行(或系统闲置)...这就是其他各种睡眠功能答案是为了。
windows.h, *nix上有unistd.h的睡眠。
有一个更优雅的解决方案 @ http://www.faqs.org/faqs/unix-faq/faq/part4/section-6.html
不隶属于 StackOverflow