io_service::run()을 종료한 후 Boost::asio가 확인자 서비스 소멸자에서 중단됩니다.
-
28-09-2020 - |
문제
나는 메인 스레드에서 io_service.run()을 호출하는 상당히 간단한 Boost::asio 설정을 사용하고 있습니다.tcp 확인자가 있고 비동기 확인을 사용하여 주소를 조회합니다.조회가 실패하면 비동기 콜백 내에서 예외가 발생합니다.주 함수 내부의 run() 호출 외부에서 이 예외를 포착합니다.그런 다음 io_service 인스턴스(전역)에서 stop()을 호출합니다.그러나 main()이 반환되면 프로그램이 중단됩니다.확인자 서비스에서 결코 제공되지 않는 exit_event_를 기다리고 있는 것으로 나타났습니다.
나는 출구에 매달리고 싶지 않습니다.내가 뭘 잘못하고 있는 걸까요?그렇다면 무엇입니까?나는 온라인에서 이러한 것들에 대해 많은 토론을 찾지 못했습니다.저는 Windows 7/64bit에서 Boost 1.41.0을 사용하고 있습니다.
해결책
그런 다음 io_service에서 stop()을 호출합니다.
이 트릭을 사용해 보십시오(다음에서 복사됨). io_service 문서) 멈춰야 할 때 io_service
:
boost::asio::io_service io_service;
auto_ptr<boost::asio::io_service::work> work(
new boost::asio::io_service::work(io_service));
...
work.reset(); // Allow run() to exit.
이유는 간단합니다(문서에도 나와 있음).~에게 전화 해 io_service::stop()
io_service run() 호출이 가능한 한 빨리 반환되어 완료되지 않은 작업을 포기하고 준비된 핸들러가 전달되는 것을 허용하지 않습니다.
그래서, 전화 io_service::stop()
모든 핸들러를 파견해야 하는 경우에는 충분하지 않습니다.
제휴하지 않습니다 StackOverflow