2016-12-25 2 views
0

Ich studiere ein Buch über Boost, jetzt bin ich in Asio Kapitel.Boost :: Asio unter Windows funktioniert nicht asynchron

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

Ich fand ein einfaches Beispiel für asynchrone Timer. Ich war sehr überrascht, als ich auf meinem Windows-Laptop bemerkte, dass die Beispiele anders funktionieren, als der Autor es beschrieben hat. Hier

ist der Code des Beispiels (leicht modifiziert im Vergleich zu dem Buch, ich meine die Werte des Timer):

#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(); 
} 

Ich erwartete, dass ich auf der Konsole nach 3 Sek ersten Ausdruck sehen soll, und nach den nächsten 6 Sekunden sollte ich den zweiten Ausdruck sehen. Aber unter Windows funktionierte das nicht so. Das Programm hat 9 Sekunden gewartet, um beide Nachrichten gleichzeitig zu drucken. Das sollte nicht so funktionieren!

Ich habe überprüft, dass unter Linux alles funktioniert, wie erwartet.

Weiß jemand, warum es so unterschiedliche Verhaltensweisen unter Windows und Linux gibt? Dieses Verhalten unter Windows macht den Asio unbrauchbar, es funktioniert nicht asynchron.

Grüße YotKay

Antwort

1

cout nicht bündig seinen Ausgang nicht sofort standardmäßig. Fügen Sie am Ende jedes Anrufs << std::endl zu cout hinzu und sehen Sie, ob Sie die erwarteten Ergebnisse erhalten.

+0

Sie hatten Recht! Vielen Dank. Das Problem liegt in der Spülung, es funktioniert unter Windows und Linux anders. Als ich dem Windows-Programm std :: endl hinzugefügt habe, zeigte es nach 3 Sekunden den Ausdruck auf der Konsole an. Mit Asio ist also alles in Ordnung. – YotKay

+1

@YotKay Asio ist seit langer Zeit zuverlässiger als Windows ... –