【发布时间】:2015-01-18 14:36:54
【问题描述】:
在第5个教程中,我在问题底部给出的代码,asio文档介绍了输出如下:
Timer 2: 0
Timer 1: 1
Timer 2: 2
Timer 1: 3
Timer 2: 4
.
.
.
在第一个之后,它是预期的,具有顺序。 但是即使 Timer1 先被包裹在 strand 中,为什么 Timer 2 会先开始运行呢?
#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
class printer
{
public:
printer(asio::io_service& io)
: strand_(io),
timer1_(io, boost::posix_time::seconds(1)),
timer2_(io, boost::posix_time::seconds(1)),
count_(0)
{
timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
}
~printer()
{
std::cout << "Final count is " << count_ << "\n";
}
void print1()
{
if (count_ < 10)
{
std::cout << "Timer 1: " << count_ << "\n";
++count_;
timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
}
}
void print2()
{
if (count_ < 10)
{
std::cout << "Timer 2: " << count_ << "\n";
++count_;
timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
}
}
private:
asio::strand strand_;
asio::deadline_timer timer1_;
asio::deadline_timer timer2_;
int count_;
};
int main()
{
asio::io_service io;
printer p(io);
asio::thread t(boost::bind(&asio::io_service::run, &io));
io.run();
t.join();
system("PAUSE");
return 0;
}
【问题讨论】:
-
嗯,有没有可能是我没弄明白? strand 是否真的介意包装的顺序,还是只是确保这些计时器不会同时运行?
-
大胆猜测:从
main中删除io.run();线程t已经调用它。这看起来像是一种竞争条件,可能会使有趣的事情成为可能。 -
这就是本教程的重点。它展示了 strand 如何使从多个线程运行 io.run() 成为可能。当然,当你删除线程 t 时,一切正常。
标签: c++ multithreading boost-asio