c++ - 在 deadline_timer 等待时使用 io_service::post (boost)

标签 c++ boost timer boost-asio deadlines

我在使用 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/

相关文章:

c++ - 将元素插入已排序的循环双链表

C++ 包括 C 文件(未找到 typedef)

c++ - 初始化 std::string 的不同方法之间的区别

c++ - 如何使 "whose type uses the anonymous namespace [-Werror]"gcc 版本 4.8.2 静音

c++ - Opencv 视频帧。我只能看到最后一帧

c - 根据 settimeofday 调整基于 CLOCK_REALTIME 的计时器

c++ - 以下 C++ 代码线程安全吗?

c++ - boost 互斥量和类成员访问

c++ - 有使用 Boost.Log 日志库的经验吗?

Java静态TimerTask关闭