Boost Asio Deadline Timer를 안전하게 취소
이 문서에서는 Boost::asio::basic_waitable_timer
문제:
처음에 타이머를 취소하는 제안된 솔루션은timer.get_io_service().post([&]{timer.cancel() ;}) 실패한 것처럼 보일 수 있습니다. cancel()을 호출한 후에도 타이머가 중단되지 않습니다.
이유:
문제는 취소 후 타이머의 동작에 있습니다. 미해결 비동기 작업을 종료하지 않고 완료 핸들러가 호출될 때 새로운 비동기 대기를 시작합니다.
해결책:
타이머를 안전하게 취소하려면 다음이 필수적입니다. 현재 진행 중인 비동기 작업이 있는지 확인하세요. 이 확인은 타이머의 만료 시간을 현재 시간과 비교하여 수행할 수 있습니다:
<code class="cpp">timer.get_io_service().post([](){ if (timer.expires_from_now() >= std::chrono::steady_clock::duration(0)) { timer.cancel(); } });</p> <p><strong>향상된 취소:</strong></p> <p>현재 작업을 취소하는 것 외에도 완료 핸들러에 종료 신호를 전달하는 것이 좋습니다. 이는 타이머의 만료 시간을 Timer::clock_type::time_point::min()과 같은 특수 값으로 설정하여 달성할 수 있습니다.</p> <pre class="brush:php;toolbar:false"><code class="cpp">timer.expires_at(Timer::clock_type::time_point::min());</code>
이를 통해 완료 핸들러는 종료 상태를 식별할 수 있습니다.
<code class="cpp">void handle_timeout(const boost::system::error_code& ec) { if (timer.expires_at() != Timer::time_point::min()) { // timer is not in shutdown state // ... } else { // timer is in shutdown state std::cerr << "handle_timeout: detected shutdown\n"; } }
이러한 기술을 구현하면 Boost::asio::basic_waitable_timer 위 내용은 Boost::asio::basic_waitable_timer를 안전하게 취소하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!