2016-12-25 83 views
0

我正在學習關於Boost的一本書,現在我在Asio章節中。Windows上的Boost :: Asio不能異步工作

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

我發現了一些簡單的異步定時器的例子。當我在筆記本電腦上發現這些示例的工作方式與作者描述它的方式不同時,我感到非常驚訝。

這裏的例子(與書略作修改,我指的是定時器的值)的代碼:

#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

cout默認情況下不立即刷新它的輸出。在每次致電cout結束時添加一個<< std::endl,並查看您是否得到預期的結果。

+0

你說得對!謝謝。問題在於刷新,它在Windows和Linux上的工作方式不同。當我將std :: endl添加到Windows程序時,它在3秒後開始在控制檯上顯示打印輸出。所以Asio一切都很好。 – YotKay

+1

@YotKay asio比Windows有更長的可靠性... –