Windows上的Boost :: Asio不能异步工作

时间:2016-12-25 21:06:45

标签: c++ linux windows boost

我正在读一本关于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无法使用,它不能异步工作。

此致 YotKay

1 个答案:

答案 0 :(得分:1)

默认情况下,

cout不会立即刷新其输出。在<< std::endl的每次通话结束时添加cout,看看您是否得到了预期的结果。