【问题标题】:Boost::Asio on Windows doesn't work asynchronouslyWindows 上的 Boost::Asio 不能异步工作
【发布时间】:2016-12-25 21:06:45
【问题描述】:

我正在学习一本关于 Boost 的书,现在我在 Asio 章节。

https://theboostcpplibraries.com/boost.asio-scalability

我找到了一些简单的异步计时器示例。当我在我的 Windows 笔记本电脑上注意到这些示例的工作方式与作者描述的方式不同时,我感到非常惊讶。

这里是例子的代码(相比书略有修改,我指的是定时器的值):

#include <boost/asio/io_service.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <thread>
#include <iostream>

using namespace boost::asio;

int main()
{
  io_service ioservice1;
  io_service ioservice2;

  steady_timer timer1{ioservice1, std::chrono::seconds{3}};
  timer1.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });

  steady_timer timer2{ioservice2, std::chrono::seconds{9}};
  timer2.async_wait([](const boost::system::error_code &ec)
    { std::cout << "9 sec\n"; });

  std::thread thread1{[&ioservice1](){ ioservice1.run(); }};
  std::thread thread2{[&ioservice2](){ ioservice2.run(); }};
  thread1.join();
  thread2.join();
}

我预计 3 秒后我应该会在控制台上看到第一个打印输出,然后在接下来的 6 秒后我应该会看到第二个打印输出。但在 Windows 上,它并没有以这种方式工作。程序等待 9 秒以同时打印两条消息。这不应该这样工作!

我检查了在 Linux 上一切正常,正如预期的那样。

有谁知道为什么在 Windows 和 Linux 上的行为会有如此大的差异? Windows 上的这种行为使 Asio 无法使用,它不能异步工作。

问候 优凯

【问题讨论】:

    标签: c++ linux windows boost


    【解决方案1】:

    cout 默认情况下不会立即刷新其输出。在每次调用cout 的末尾添加&lt;&lt; std::endl,看看您是否获得了预期的结果。

    【讨论】:

    • 你是对的!谢谢你。问题在于刷新,它在 Windows 和 Linux 上的工作方式不同。当我将 std::endl 添加到 Windows 程序时,它在 3 秒后开始在控制台上显示打印输出。所以 Asio 一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多