需要更好的等待解决方案

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 在 Windows 上也可用,您只需安装库。 Getting Started Guide 或下载precompiled version 请记住 - 在多线程环境中 -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 循环。

【讨论】:

以上是关于需要更好的等待解决方案的主要内容,如果未能解决你的问题,请参考以下文章

C 中的 usleep() 是不是实现为忙等待?

selenium 显示等待和隐式等待哪个更好

在批处理文件中休眠

前端用iframe要等待很长一段时间有啥解决方案吗?

需要更好的解决方案来删除特殊字符和数字

招生报名小程序开发笔记一:开发背景和技术方案的选型确定