2016-12-25 6 views
0

부스트에 대한 책을 공부하고 있습니다. 이제 저는 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(); 
} 
I는 I 3 초 후 콘솔 제 출력을 참조하고한다고 예상

다음 6 초 후에 두 번째 출력물을 볼 수 있습니다. 그러나 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보다 더 오래 신뢰할 수 있습니다 ... –

관련 문제