이전에 완료되기 전에 boost :: asio 소켓에 두 번째 쓰기를 시도하면 어떻게 될지 알 수 없다. 이것은 많은 비동기 프로그램에서 잠재적으로 발생할 수있는 것처럼 보입니다. 첫 번째 쓰기를 마친 후에 프로그램이 끝날 때까지 기다렸다가 잠재적으로 두 번째 메시지를 보내는 등의 문제가 발생할 수 있습니다. 나는 일어날 수있는 몇 가지 가능한 일들을 생각해 냈다. (이것은 모든 경우에 메시지가 async_write에 대한 단일 호출로 전송된다고 가정한다.) 심지어 하나의 TCP 패킷 단일 소켓에 boost :: asio를 여러 번 쓰다.
- 하는 Asio가 MSG1 다음 MSG2를 보낸다
그래서 제 송신 에러가 발생하지 않는다고 가정 MSG1까지 블록 결과가 제가 있어 가정void handleWrite(const boost::system::error_code&error) { if(error)throw NetError(error); } vodi sendStuff() { const char msg1 = "Red, Green, Blue"; const char msg2 = "One, Two, Three"; asio::async_write(socket,asio::buffer(msg1,sizeof(msg1)),boost::bind(&handleWrite,_1)); //assume msg1 has still not been sent by the time we get here asio::async_write(socket,asio::buffer(msg2,sizeof(msg2)),boost::bind(&handleWrite,_1)); }
msg1s 에러가 발생하는 경우를
관련된 io_service에 스레드 풀이 있거나 단일 스레드 만있는 경우에도 영향을 받습니까?
안전하지 않은 경우 보낼 메시지 큐를 유지하는 일종의 간단한 래퍼를 작성하고 하나씩 보내고 쓰기 처리기에서 예외를 throw하는 경우 중단합니다.