2017-11-13 1 views
0

다음은 내 코드입니다.단일 스레드에서 asio :: async_write를 사용할 때 "요청한 리소스가 사용 중입니다"

boost::asio::async_write(*serialPort, boost::asio::buffer(*something),handler); 
boost::asio::async_write(*serialPort, boost::asio::buffer(*something2),handler); 

상기 코드가 에러가 두 번째 줄에 "요청 된 리소스를 사용중인"얻을 (비동기 스트림은 직렬 포트이다). 하지만 스트림을 tcp 소켓으로 변경하면 everthing이 정상적으로 작동합니다. 왜?

이러한 비동기 작업을 이러한 방법으로 사용할 수 없다는 것을 알았지 만 첫 번째 코드는 하트 비트 패키지 일 수 있으며 두 번째 줄은 정기적으로 전송되지 않는 패키지 일 수 있습니다. 그리고 이러한 send 작업 버퍼는 동시에 수집 할 수 없습니다. 단일 스레드 (또는 다중 스레드)에서 이러한 비동기 작업을 동기화하는 방법이 있습니까?

+1

, tcp를 쓰기 동기 때문에 완료 할 가능성이 높습니다보기 OS는 소켓에 대해 더 큰 버퍼를 사용합니다. 단일 쓰기가 작업을 완료 할 수 있도록 두 버퍼를 병합하기 만하면됩니다. –

+1

ASIO로 비동기 I/O를 수행하는 방법을 연구하십시오. 하나의 비동기 작업을 시작하여 완료 콜백을 제공해야 다음 콜을 할 수 있습니다. – rustyx

답변

0

의견 작성자의 의견입니다. 이 경우 쉽게 버퍼 순서 ("scatter/gather IO")를 사용할 수 있습니다 :

std::vector<boost::asio::const_buffer> buffers { 
    boost::asio::buffer(*something), 
    boost::asio::buffer(*something2) 
}; 

boost::asio::async_write(*serialPort, buffers, handler); 

Compiling On Coliru

에만 사고로 작동
#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
#include <boost/asio/serial_port.hpp> 

void handler(boost::system::error_code ec, size_t) { 
    std::cout << __PRETTY_FUNCTION__ << ": " << ec.message() << "\n"; 
} 

int main() { 
    boost::asio::io_service svc; 

    auto serialPort = std::make_shared<boost::asio::serial_port>(svc); 

    auto something = std::make_shared<std::string>("hello world\n"); 
    auto something2 = std::make_shared<std::string>("bye world\n"); 

    std::vector<boost::asio::const_buffer> buffers { 
     boost::asio::buffer(*something), 
     boost::asio::buffer(*something2) 
    }; 

    boost::asio::async_write(*serialPort, buffers, handler); 
} 
관련 문제