차단 및 차단 해제 조건
Boost.Asio의 io_service를 사용하는 경우: :run() 메소드가 호출되면 일반적으로 다음 조건 중 하나가 충족될 때까지 차단됩니다. met:
더 이상 예외가 없으면 run()이 차단된다는 점에 유의하세요. io_service에 의해 "디스패치"될 핸들러입니다. 핸들러는 해당 비동기 작업이 완료될 때 호출되는 콜백 함수 또는 핸들러 개체를 나타냅니다. 모든 예약된 작업과 핸들러가 실행되면 io_service는 대기 중인 작업 없이 자신을 유휴 상태로 간주하여 run() 차단을 해제합니다.
예 1: 동기식 TCP/IP 클라이언트
귀하의 질문에 제공된 예제 코드에서 run() 메서드는 비동기 읽기 작업이 완료될 때까지 기다리기 때문에 차단됩니다. 소켓은 서버에서 데이터를 수신하도록 설정되어 있으며, 데이터가 handler_async_receive 핸들러에 의해 수신 및 처리될 때까지 run() 메서드는 차단된 상태로 유지됩니다.
예 2: 작업자 스레드 풀
두 번째 예에서는 run()이 작업자 스레드 내에서 호출됩니다. 작업 개체는 예약된 처리기가 없는 경우에도 io_service가 활성 상태를 유지하도록 보장합니다. CalculateFib 핸들러가 io_service에 게시되면 작업자 스레드에 의해 실행됩니다. 세 가지 피보나치 계산이 모두 완료되면 작업 개체가 삭제되어 io_service가 새 작업 수락을 중지합니다. 이는 작업자 스레드에 더 이상 실행할 작업이 없다는 신호를 보내 종료되도록 합니다. 결과적으로 run()이 차단 해제되고 메인 스레드가 진행될 수 있습니다.
예제 1과 2의 차이점
두 예 모두 비동기 작업을 사용하지만 첫 번째 예는 효과적으로 동기식으로 작동합니다. 데이터가 수신될 때까지 차단되기 때문입니다. 두 번째 예에서는 작업자 스레드가 병렬로 실행되어 io_service가 추가 작업을 기다리는 동안 다른 작업을 처리할 수 있습니다.
비동기 및 동기 작업
일반적으로 , 동기 작업과 비동기 작업을 혼합하면 코드가 복잡해질 수 있으므로 피하는 것이 좋습니다. 비동기 프로그래밍의 장점은 다음과 같습니다.
위 내용은 Boost.Asio의 io_service::run() 메소드는 언제 차단을 해제합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!