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& ec) { if (!ec) { started = true; if (timer.expires_at() != Timer::time_point::min()) { timer.expires_from_now(std::chrono::milliseconds(10)); timer.async_wait(&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 중국어 웹사이트의 기타 관련 기사를 참조하세요!