在线程中使用booststeady_timer和睡眠之间有什么区别?

时间:2019-07-27 15:45:23

标签: c++ boost-asio

我很难弄清楚带有回调的boost :: steady_timer会比线程中的简单sleep()好。 Here我得出的结论是,唯一明显的好处是时间粒度。

我的问题与链接中的问题略有不同,因此,不胜感激。

这是2个应用程序的源代码:

c.cpp

unsigned i = 0;
void f(error_code e, ba::steady_timer& t){
    cout << "Waiting: "<< i++ << endl;
    sleep(2);
    t.async_wait(boost::bind(f,_1, std::ref(t)));
}

int main()
{
    ba::io_service ios;
    ba::steady_timer t(ios, seconds(5));
    t.async_wait(boost::bind(f,_1, std::ref(t)));

    ios.run();

    return 0;
}

d.cpp

unsigned i = 0;
void f() {
    while(true)
    {
        cout << "Waiting: "<< i++ << endl;
        sleep(2);
    }
}

int main()
{
    std::thread th(f);
    th.join();
    return 0;
}

实际上,我希望 sleep()版本会显示更多的CPU消耗(只是因为我在书中阅读过此内容:

“错误的解决方案创建了一个线程进行检查,然后休眠5秒钟。这是一个la脚的解决方案,它占用了大量系统资源,并且伸缩性很差。”

但是,运行两个应用程序并在Linux Mint上使用ps对其进行检查都没有任何区别。

那为什么要选择steady_timer或其他计时器呢?

dim@laptop:~/Documents/test$ ps -C c -f
UID        PID  PPID  C STIME TTY          TIME CMD
dim      11328  9486  0 18:21 pts/1    00:00:00 ./c
dim@laptop:~/Documents/test$ ps -C d -f
UID        PID  PPID  C STIME TTY          TIME CMD
dim      11329  9486  0 18:21 pts/1    00:00:00 ./d
dim@laptop:~/Documents/test$ 

1 个答案:

答案 0 :(得分:0)

如果您的目标是等待2秒,那么您可以从主线程调用sleep。但这不是多线程程序通常需要执行的操作。 现在想象一下,您有多个回调,仅运行2个线程分别睡眠1秒钟和2秒钟,这将是非常浪费的。另一方面,使用计时器,您可以在同一线程中甚至在线程池中做很多事情。