boost :: asio :: steady_timer()vs sleep()我应该使用哪一个?

时间:2018-11-02 01:52:32

标签: c++ boost

从运行时间的角度来看,以下两个程序相同,均等待5秒钟才能继续。一个使用boost :: asio :: steady_timer,另一个使用sleep(),哪个更好?

1)使用sleep()

$ cat b.cpp
#include <iostream>
#include <unistd.h>

int main(void)
{
    std::cout << "start" << std::endl;
    sleep(5);
    std::cout << "end" << std::endl;
}

$ g++ b.cpp && ./a.out
start
end

2)使用boost :: asio :: steady_timer

$ cat c.cpp
#include <iostream>
#include <boost/asio.hpp>

int main(void)
{
    std::cout << "start" << std::endl;
    boost::asio::io_context io;
    boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
    t.wait();
    std::cout << "end" << std::endl;
    return 0;
}

$ g++ c.cpp -lpthread -lboost_system && ./a.out
start
end

1 个答案:

答案 0 :(得分:2)

1)

sleep(5)
  • meh:依赖于unistd.h标头,它是非标准且特定于posix的,可能会或可能不会出现问题,但这是要考虑的问题
  • con:仅需整数,因此您无法选择亚秒级睡眠,并且可能不清楚这表示5秒,而不是其他单位。

2)

boost::asio::io_context io;
boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
t.wait();
  • meh:依赖于boost,如果您已经包含另一个boost库,这不是问题,但仅出于此目的会显得过分
  • con:取决于io_context
  • pro:使用boost::asio::chrono定义睡眠时间,可以使您更细腻,更清晰

3)

std::this_thread::sleep_for(std::chrono::seconds(5));
  • pro:标准库函数(C ++ 11及更高版本)
  • pro:使用std::chrono定义睡眠时间,可以使您更细腻,更清晰

注意:如果您是C ++ 11之前的版本,boost也有 this_thread::sleep_for