我很难弄清楚带有回调的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$
答案 0 :(得分:0)
如果您的目标是等待2秒,那么您可以从主线程调用sleep。但这不是多线程程序通常需要执行的操作。 现在想象一下,您有多个回调,仅运行2个线程分别睡眠1秒钟和2秒钟,这将是非常浪费的。另一方面,使用计时器,您可以在同一线程中甚至在线程池中做很多事情。