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

标签 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 无法使用,它不能异步工作。

问候 优凯

最佳答案

cout默认情况下不会立即刷新其输出。添加 << std::endl每次通话结束 cout看看您是否获得了预期的结果。

关于c++ - Windows 上的 Boost::Asio 不能异步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324517/

相关文章:

c++ - VS2013 - 多次包含同一 header 时出错

linux - ALSA soc_pcm_open() 未被调用

windows - 将正在运行的 WinStore App 切换到全屏

java - JNI 从 DWord 返回值

c++ - 当除数大于两个大因子时的模积

c++ - 对象的构造函数作为函数参数

php - lynx unix 命令无法使用 URL 中的多个参数

c# - ProtectData 类使用哪种加密算法?

windows - 通过 Windows 套接字发送大于 1 MB 的大数据,即使用 Send 函数