我在使用 deadline_timer 和 io_service::post 时遇到问题,如下所示:
#include "boost/asio.hpp"
#include "boost/thread.hpp"
int main()
{
boost::asio::io_service io_service;
boost::asio::deadline_timer timer1(io_service);
boost::asio::deadline_timer timer2(io_service);
timer1.expires_from_now(boost::posix_time::seconds(1));
timer1.async_wait([](const boost::system::error_code& error) {
boost::this_thread::sleep(boost::posix_time::seconds(5));
printf("1 ");
});
timer2.expires_from_now(boost::posix_time::seconds(2));
timer2.async_wait([](const boost::system::error_code& error) {
printf("2 ");
});
boost::thread t([&io_service]() {
boost::this_thread::sleep(boost::posix_time::seconds(5));
io_service.post([]() {
printf("3 ");
});
io_service.post([]() {
printf("4 ");
});
});
io_service.run();
t.join();
getchar();
return 0;
}
我认为结果是“1 2 3 4”,但结果是“1 3 4 2”。任何人都可以告诉我如何使用 boost 库执行 timer2(print "2") 的回调,结果为 "1 2 3 4"(并且不要更改 timer1 和 timer2 的过期时间)。
非常感谢!
最佳答案
这实际上是一个相当复杂的例子。
io_service
将在主线程上运行。这是操作顺序
主线程:
- 在 T0 + 1 请求计时器
- 在 T0 + 2 请求计时器
- 生成线程
- 执行所有挂起的io (
io_service.run()
)
次要线程:
- 睡 5 秒
- 请求计时器
- 请求计时器
首先,在调用 io_service.run()
之前,io_service
中不会执行任何内容。
调用 io_service.run()
后,将安排一个 future 1 秒的计时器。当该计时器触发时,它会先休眠 5 秒,然后再打印 1。
当该线程正在执行时,辅助线程也启动并休眠 5 秒。此线程在 timer1
的处理程序中执行的计时器完成之前设置和调度。由于这两个线程都休眠了 5 秒,因此“2”和“3”会立即发布到 io_service
。
现在事情变得有点棘手了。 timer2
的超时似乎现在应该已经过期( future 至少 5 秒),但是有两个命令直接发布到 io_service
而它正在处理 timer1
。
似乎在实现细节中,boost 优先考虑直接发布的操作,而不是截止时间计时器操作。
关于c++ - 在 deadline_timer 等待时使用 io_service::post (boost),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38792703/