需要更好的等待解决方案
Posted
技术标签:
【中文标题】需要更好的等待解决方案【英文标题】:Need a better wait solution 【发布时间】:2011-05-05 11:01:54 【问题描述】:最近我一直在用 C++ 编写一个程序,它 ping 三个不同的网站,然后根据通过或失败,它会等待 5 分钟或 30 秒,然后再试一次。
目前我一直在使用 ctime 库和以下函数来处理我的等待。但是,根据我的 CPU 计,这是一个不可接受的解决方案。
void wait (int seconds)
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC;
while (clock () < endwait)
这个解决方案不可接受的原因是,根据我的 CPU 计,程序在等待时以我的 CPU 的 48% 到 50% 运行。我有一个 Athlon 64 x2 1.2 GHz 处理器。我的 130 行程序也不可能接近 50%。
我怎样才能更好地编写我的等待函数,以便它只使用最少的资源?
【问题讨论】:
这能回答你的问题吗? Sleep for milliseconds 【参考方案1】:对于 C++11 标准,可以使用以下方法:
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::seconds(100));
也可以使用sleep_until
。
【讨论】:
哇!谢谢,我不知道它可以以独立于平台的便携方式完成:) 是的,但也许时间分辨率不是 1 毫秒,而是 16-17 毫秒。您可能很幸运有 100 毫秒,但指定 101 毫秒实际上可能会导致 117 毫秒。对于低值,相对误差会更糟,例如指定 3 ms 可能会导致 17 ms 的实际睡眠时间。换句话说,几秒钟内可以接受的睡眠在低毫秒内分解为睡眠。【参考方案2】:只是为了解释正在发生的事情:当您调用 clock() 时,您的程序会再次检索时间:您要求它尽可能快地执行此操作,直到它到达结束时间......这使得 CPU 内核运行程序通过你的循环尽可能快地“旋转”,每秒读取数百万次时间,希望它会滚动到结束时间。你需要告诉操作系统你想在一段时间后被唤醒......然后他们可以暂停你的程序并让其他程序运行(或系统空闲)......这就是其他中提到的各种睡眠功能答案是为了。
【讨论】:
【参考方案3】:为了保持便携,您可以使用Boost::Thread 睡觉:
#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;
【讨论】:
我喜欢这个主意,但是我使用的是 Windows,我似乎没有boost::this_thread::sleep
会为您的代码添加一个中断点。 boost.org/doc/libs/1_49_0/doc/html/thread/…【参考方案4】:
windows.h 中有 Sleep,在 *nix 上 unistd.h 中有 sleep。
还有一个更优雅的解决方案@http://www.faqs.org/faqs/unix-faq/faq/part4/section-6.html
【讨论】:
【参考方案5】:使用 sleep 而不是空的 while 循环。
【讨论】:
以上是关于需要更好的等待解决方案的主要内容,如果未能解决你的问题,请参考以下文章