这是我的代码。
boost::asio::async_write(*serialPort, boost::asio::buffer(*something),handler);
boost::asio::async_write(*serialPort, boost::asio::buffer(*something2),handler);
上面的代码将在第二行收到错误“所请求的资源正在使用中”(请注意,异步流是串行端口)。但是当我将流更改为tcp套接字时,everthing工作正常。为什么呢?
现在我知道我不能用这些组合的异步操作,但第一行代码可能是一个心跳包,第二行可能是一个不经常发送的包。而这些发送操作缓冲区不能同时聚集在一起。有没有办法在单个线程(或多线程)中同步这些异步操作?
答案 0 :(得分: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);
#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);
}