2013-08-31 3 views
5

(단일 스레드) boost::asio:io_service을 사용하여 많은 TCP 연결을 처리하고 있습니다. 각 연결에 대해 나는 deadline_timer를 사용하여 타임 아웃을 잡습니다. 연결 시간이 초과되면 다른 연결의 결과를 전혀 사용할 수 없습니다. 따라서 io_service를 완전히 다시 시작하고 싶습니다. io_service.stop()을 호출하면 대기열의 "완료된"처리기를 호출 할 수 있고 오류가있는 대기열의 처리기를 호출 할 수 있다고 생각했습니다.stop() 후 boost :: asio :: io_service 지우기

그러나 처리기가 대기열에 남아있는 것처럼 보이므로 io_service.reset() 이상을 호출하면 io_service.run()은 이전 처리기를 다시 가져옵니다. 누구든지 io_service.stop()이 호출 된 후에도 처리기가 실제로 대기열에 남아 있음을 확인할 수 있습니다. 그렇다면 io_service를 완료 할 수있는 가능성은 무엇입니까? 대기중인 모든 처리기를 제거 하시겠습니까?

답변

6

io_service::stop()io_service::reset()io_service의 이벤트 루프 상태 만 제어합니다. 지연 실행 (준비 실행) 또는 사용자 정의 핸들러 오브젝트에 대해 스케줄 된 핸들러의 수명에는 영향을주지 않습니다. io_service에 대한

destructor 모든 뛰어난 핸들러가 파괴되는 원인이됩니다

  • shutdown_service() 멤버 함수가 호출이됩니다 io_service과 관련된 각 서비스 개체를. Service 형식 요구 사항에 따라 shutdown_service() 구성원 함수는 서비스가 보유한 사용자 정의 처리기 개체의 모든 복사본을 삭제합니다.
  • io_service 및 그 임의의 가닥에 대해 지연된 호출을 위해 예정된 호출되지 않은 처리기 개체가 삭제됩니다.

중 하나를 고려하십시오

  • io_service 개체의 수명을 제어합니다. 한 접근법은 this 대답에서 찾을 수 있습니다.
  • io_service을 실행 완료. 이 경우 종종 상태 설정, 처리되지 않은 작업 취소 및 완료 처리기가 io_service에 추가 작업을 게시하지 못하게해야합니다. Boost.Asio는 공식 timeout 예제를 제공하고 완료시 io_service까지 실행되는 시간 초과 접근 방식은 here으로 표시됩니다.
관련 문제