2011-01-16 3 views
28

현재 몇 가지 간단한 tcp 네트워킹을 위해 boost :: asio를 처음 사용하고 있습니다. allready 내가 어떻게 대처해야할지 모르겠다 무언가에 걸쳐왔다. 지금까지 io_service.run() 메서드는 기본적으로 수행 할 루프가 더 이상 남아 있지 않을 때까지 실행됩니다. 즉, 작은 서버 객체를 릴리스 할 때까지 실행됩니다. 필자는 이미 mainloop을 설정했기 때문에 단순함을 위해서 네트워킹 루프를 수동으로 업데이트하려고합니다. io_service.poll()은 내가 원하는대로 할 수 있다고 생각합니다.Boost :: Asio : io_service.run() vs poll() 또는 mainloop에 boost :: asio를 어떻게 통합합니까?

void myApplication::update() 
{ 
    myIoService.poll(); 
    //do other stuff 
} 

이것은 작동하는 것처럼 보이지만 boost :: asios io 서비스를 처리하는 일반적인 방법으로 보이지 않기 때문에이 방법의 단점이 있는지 궁금합니다. 이것이 유효한 접근 방법입니까, 아니면 io_service.run()을 비 차단 추가 스레드에서 사용해야합니까?

답변

37

io_service::run 대신 io_service::poll을 사용하는 것이 완벽하게 허용됩니다. 차이점은 documentation

여론 조사() 함수를 설명한다도 차단하지 않고 준비 핸들러 디스패치 를 사용하지만 수있다. 작업 클래스는 io_service을 통보하는 데 사용되는 큐

에 남아있는 work이 있다면 io_service::run 차단됩니다

참고하면 작업을 시작하고 완료. 이렇게하면 작업이 진행되는 동안 io_service 개체의 run() 함수 이 종료되고 이 종료되지 않고 완료되지 않은 작업이 완료되면 이 종료됩니다.

io_service::poll은이 동작을 나타내지 않고 준비된 처리기를 호출합니다. 또한 후속 호출시 io_service::reset을 호출하여 io_service:run 또는 io_service::poll으로 호출해야합니다.

+9

'io_service :: poll'이 반환 된 후에 반드시'io_service'가 멈추는 것은 아닙니다. 후속 'io_service :: run' 또는'io_service : poll' 전에 왜'io_service :: reset'을 필요로합니까? – updogliu

2

단점은 바쁜 루프를 만드는 것입니다.

while(true) { 
    myIoService.poll() 
} 

은 100 % cpu를 사용합니다. myIoService.run()은 0 %의 CPU를 사용합니다.

myIoService.run_one() 원하는대로 할 수는 있지만 할 일이 없으면 차단됩니다.

+2

당신은 실제로이 단순한 경우를 실행하지만 이벤트 루프가 이미 존재하는 상황에서 (예를 들어 배경 렌더링이나 여분의 사이클에서 다른 일을하고 있다고 가정 할 때) 게임을 멈추기를 원하지 않으므로 설문 조사가 선호됩니다 때마다 run() 블록. –

관련 문제