>백엔드 개발 >C++ >Boost::asio::basic_waitable_timer를 안전하게 취소하는 방법은 무엇입니까?

Boost::asio::basic_waitable_timer를 안전하게 취소하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-25 11:33:02936검색

How to Safely Cancel a boost::asio::basic_waitable_timer?

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&amp; 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.