2012-11-04 3 views

답변

9

io_service::run()은 비동기 작업이 수행되는 한 작업을 실행합니다. 보류 중 (또는 처리기 호출 중)의 비동기 조작이 없으면 run() 호출이 리턴됩니다.

그러나 모든 작업이 완료 될 때까지 run() 전화를 종료하지 말고 io_service을 종료 할 것을 명시 적으로 지시 한 디자인이 있습니다. 그것은 io_service::work이 사용 된 것입니다. work 개체를 생성하면 (보통 힙과 공유 _ptr에서 수행) io_service는 항상 보류중인 것을 고려하므로 run() 메서드는 반환되지 않습니다. 일단 서비스를 종료 할 수있게하려면 (일반적으로 종료하는 동안) 작업 개체를 삭제합니다.

+0

reset()을 사용하는 것처럼 삭제 하시겠습니까? – lucastamoios

+2

보통, shared_ptr을 사용하여 작동한다면, 예, shared_ptr에'reset()'을 호출합니다. –

6

io_service::work은 실제로 당신이 io_servicework를 추가, 당신은 소켓 작업 및 비동기 읽기를 시작하는 경우, 예를 들어, io_service의 인스턴스에 게시 할 수있는 모든 작업의 ​​기본 클래스입니다. 그래서 당신은 일반적으로 직접 work를 사용하지 않습니다,하지만 한 가지 예외가 여기에 있습니다 :

io_service::run 즉시 수행 할 더 많은 일이 없기 때문에 반환, 그래서 일부 생산자와 소비자 스레드를 가지고 응용 프로그램을 고려할 것, 생산자는 때때로 작품을 생산 io_service::post으로 소비자 스레드에 게시하지만 모든 작업이 완료되면 io_service::run이 반환되어 소비자 스레드가 중지되므로 io_service을 바쁘게 유지하기 위해 임의의 작업이 필요하므로이 경우에는 io_service::work을 직접 사용할 수 있습니다.

관련 문제