> 백엔드 개발 > C++ > 별도의 스레드에서 Boost ASIO Deadline Timer를 안정적으로 취소하는 방법은 무엇입니까?

별도의 스레드에서 Boost ASIO Deadline Timer를 안정적으로 취소하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-29 07:03:30
원래의
482명이 탐색했습니다.

How to reliably cancel a Boost ASIO Deadline Timer in a separate thread?

Boost ASIO Deadline Timer를 안전하게 취소

제공된 코드는 별도의 스레드 내에서 Boost::asio::basic_waitable_timer를 안전하게 취소하기 위한 것입니다. . 그러나 근본적인 문제로 인해 취소가 예상대로 작동하지 않는 것 같습니다.

문제 이해:

이 문제는 제공된 코드에서 발생합니다. 타이머의 io_service의 이벤트 큐에 취소 작업을 추가하는 post 함수를 사용하여 타이머 취소를 시도합니다. 취소 작업이 실행되기 전에 타이머가 이미 만료된 경우 취소 작업이 무시되어 사실상 타이머가 활성 상태로 유지되므로 이 접근 방식은 문제가 있습니다.

문제 해결:

이 문제를 해결하려면 현재 상태에 관계없이 타이머를 취소할 수 있는 강력한 방법을 고안해야 합니다. 한 가지 효과적인 접근 방식은 유효하지 않은 상태를 나타내는 타이머 만료 시점에 대한 감시 값을 도입하는 것입니다. 취소 프로세스 중에 타이머 만료를 이 센티널 값으로 설정하면 취소 전에 타이머가 만료되더라도 타이머가 잘못된 상태가 되어 추가 비동기 작업을 효과적으로 방지할 수 있습니다.

수정된 코드:

sentinel 값 접근 방식 구현:

<code class="cpp">timer.get_io_service().post([](){
    std::cerr << "tid: " << std::this_thread::get_id() << ", cancelling in post\n";
    // Cancel:
    timer.expires_at(Timer::clock_type::time_point::min());
});</code>
로그인 후 복사

완료 핸들러 처리:

완료 핸들러에서 , 종료를 감지하기 위해 센티널 값을 확인하세요.

<code class="cpp">void handle_timeout(const boost::system::error_code&amp; ec)
{
    if (!ec) {
        started = true;
        if (timer.expires_at() != Timer::time_point::min()) {
            timer.expires_from_now(std::chrono::milliseconds(10));
            timer.async_wait(&amp;handle_timeout);
        } else {
            std::cerr << "handle_timeout: detected shutdown\n";
        }
    } 
    else if (ec != boost::asio::error::operation_aborted) {
        std::cerr << "tid: " << std::this_thread::get_id() << ", handle_timeout error " << ec.message() << "\n";
    }
}</code>
로그인 후 복사

센티널 값 접근 방식을 사용하면 이제 타이머가 이미 만료된 경우에도 안정적으로 타이머를 취소할 수 있습니다.

위 내용은 별도의 스레드에서 Boost ASIO Deadline Timer를 안정적으로 취소하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿