io_service::run()을 종료한 후 Boost::asio가 확인자 서비스 소멸자에서 중단됩니다.

StackOverflow https://stackoverflow.com/questions/3324293

문제

나는 메인 스레드에서 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() 모든 핸들러를 파견해야 하는 경우에는 충분하지 않습니다.

다른 팁

stop () Io_Service가 중지 할 수 있습니다.다른 실행 () 호출로 STOP () 호출을 따르면 반환하고 정리해야합니다.

문서 .

문제가 일부 객체 평생 문제와 관련이있을 수 있습니다.IO 서비스는 여전히 참조되는 동안 IO 서비스가 파괴됩니다.예제를 자세히 살펴보고 공유 포인터가 물체가 여전히 주위에 있는지 확인하는 데 사용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top