부스트에 대한 책을 공부하고 있습니다. 이제 저는 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
당신이 옳았습니다! 고맙습니다. 문제는 플러시에 있으며 Windows와 Linux에서 다르게 작동합니다. Windows 프로그램에 std :: endl을 추가하면 3 초 후에 콘솔에 출력물이 표시되기 시작했습니다. Asio는 모든 것이 OK입니다. – YotKay
@ YotKay asio는 Windows보다 더 오래 신뢰할 수 있습니다 ... –