2011-02-14 2 views
3

일부 코드가 표시됩니다. 부스트 async_write 문제

void wh(const boost::system::error_code& ec, 
     std::size_t bytes_transferred) 
{ 
    std::cout << "test"; 
} 

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service pService; 
    boost::asio::serial_port pSerial(pService,"COM4"); 

    while (true) { 
     boost::asio::async_write(pSerial, boost::asio::buffer("A",1),&wh); 
    } 

    return 0; 
} 

내가 메모리 누수를 얻고 그 코드를 사용

, 나는 또한 내가 minicom_client에 메모리 누수를 얻고 그 코드에서 복잡한 minicom_client 튜토리얼과 같은 코드의 일부 조각을 발견했다. 내가 async_write 대신

boost::asio::write(pSerial, boost::asio::buffer("A",1)); 

를 사용하는 경우 그것은 당신이 감사에게, 거기에 당신이 제대로 async_write를 사용하지 않는 많은 ...

+0

어떤 버전의 부스트를 사용하고 있습니까? – Flexo

답변

7

을 무슨 일이 일어나고 있는지 설명 할 수 없습니다, 잘 작동합니다. 이것은 작성된 조작이며, async_write에 대한 다른 호출이 쓰기 핸들러가 호출 될 때까지 pSerial에 작성되지 않도록하는 것은 응용 프로그램의 책임입니다. documentation이 멋지게

이 조작 흐름의 async_write_some 함수 0 개 이상의 전화의 관점에서 구현 된 요약 및 합성 조작이라고 이다. 프로그램하도록해야 스트림 행하고 다른 기록 동작 이 동작이 완료 될 때까지 (예 async_write 스트림의 async_write_some 함수 또는 쓰기 수행 모든 다른 합성 작업 등).

강조 표시가 추가되었습니다. 애플리케이션을 수정하려면 wh() 메소드에서 async_write 개의 조작을 추가로 시작해야합니다. 또한 비동기 이벤트 루프 io_service::run() ~ kick off을 호출해야합니다. 이 개념이 생소하다면 직접 코드를 작성하기 전에 examples을 공부하는 것이 좋습니다.

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service pService; 
    boost::asio::serial_port pSerial(pService,"COM4"); 

    boost::asio::async_write(
     pSerial, 
     boost::asio::buffer("A",1), 
     boost::bind(
      &wh, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred 
     ); 

    pService.run(); 

    return 0; 
} 

처리기를 호출하기 전에 버퍼가 범위를 벗어날 수 있으므로 작성한 코드는 위험합니다. 일반적으로 이것은 버퍼를 boost::shared_ptr을 을 통해 async_write 처리기로 전달하는 개체의 구성원으로 유지함으로써 수행됩니다. 이 개념은 asio 예제에서 널리 사용됩니다.

+0

@hansen 예를 추가했습니다. –

+0

FYI : 제공된 코드 스 니펫 OP가 대부분 정확합니다. 유일한 원인은 async_write를 호출하는 것보다 포트에서 데이터를 보내는 데 시간이 오래 걸린다는 점입니다. 쓰기 완료 이벤트를 완료 할 수있는 것보다 빠르게 io_service 큐에 쓰기 완료 이벤트를 대기 중입니다. 문서에서는 한 번에 둘 이상의 스레드에서 동일한 객체에 대해 둘 이상의 쓰기 작업을 호출 할 수 없다고 말합니다. –