【问题标题】: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%。

我怎样才能更好地编写我的等待函数,以便它只使用最少的资源?

【问题讨论】:

标签: c++ time-wait


【解决方案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;
    }
    

    【讨论】:

    【解决方案4】:

    windows.h 中有 Sleep,在 *nix 上 unistd.h 中有 sleep。

    还有一个更优雅的解决方案@http://www.faqs.org/faqs/unix-faq/faq/part4/section-6.html

    【讨论】:

      【解决方案5】:

      使用 sleep 而不是空的 while 循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-31
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 1970-01-01
        相关资源
        最近更新 更多