2016-12-25 22 views
0

私はBoostの本を勉強しています。今はAsioの章にあります。WindowsのBoost :: Asioは非同期に動作しません

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

私は、非同期タイマーの簡単な例を見つけました。 Windowsノートパソコンで、作者の説明とは違う例があることに気付いたとき、私は非常に驚いていました。ここ

は例のコードは、(わずかにブックに比べ変性、Iは、タイマーの値を意味する)である:

#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秒後に2番目のプリントアウトが表示されます。しかし、Windowsではこの方法では動作しませんでした。プログラムは、両方のメッセージを同時に印刷するのに9秒間待った。これはこの方法では機能しません!

Linuxですべて正常に動作することを確認しました。

WindowsとLinuxの動作にこのような違いがある理由は誰にも分かりますか? Windowsでのこの動作により、Asioは使用できなくなり、非同期では動作しません。

よろしく YotKay

答えて

1

coutは、デフォルトでは、すぐにその出力をフラッシュしません。 coutへの各呼び出しの最後に<< std::endlを追加し、期待どおりの結果が得られるかどうかを確認してください。

+0

あなたは正しいです!ありがとうございました。問題はフラッシングにあり、WindowsとLinuxでは異なった働きをします。 Windowsプログラムにstd :: endlを追加すると、3秒後にコンソールに出力が表示され始めました。だから、AsioではすべてがOKです。 – YotKay

+1

@ YotKay asioは、Windowsよりもずっと長い間信頼性があります... –

関連する問題