我有一个程序(客户端服务器),该编写没有问题:
boost::asio::write(this->socket_, boost::asio::buffer(message.substr(count,length_to_send)));
其中socket_是boost :: asio :: ssl :: stream< boost :: asio :: ip :: tcp :: socket>和message是一个std :: string.
我想使这更好,无阻塞,所以我创建了一个可以替换它的函数,它被称为如下:
write_async_sync(socket_,message.substr(count,length_to_send));
这个功能的目的是:
>本质上使调用异步
>保持接口不变
我实现的函数只是使用promise / future来模拟同步行为,稍后我会修改它(在它工作之后)可以取消:
std::size_t
SSLClient::write_async_sync(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>& socket,
const std::string& message_to_send)
{
boost::system::error_code write_error;
std::promise<std::size_t> write_promise;
auto write_future = write_promise.get_future();
boost::asio::async_write(socket,
boost::asio::buffer(message_to_send),
[this,&write_promise,&write_error,&message_to_send]
(const boost::system::error_code& error,
std::size_t size_written)
{
logger.write("HANDLING WRITING");
if(!error)
{
write_error = error;
write_promise.set_value(size_written);
}
else
{
write_promise.set_exception(std::make_exception_ptr(std::runtime_error(error.message())));
}
});
std::size_t size_written = write_future.get();
return size_written;
}
问题:我无法使异步功能起作用.同步一个工作正常,但异步只是冻结,永远不会进入lambda部分(写作永远不会发生).我究竟做错了什么?
编辑:我意识到使用poll_one()使函数执行并继续,但我不明白.这就是我为io_service调用run()(在启动客户端之前):
io_service_work = std::make_shared<boost::asio::io_service::work>(io_service);
io_service_thread.reset(new std::thread([this](){io_service.run();}));
其中基本上这些是shared_ptr.这是错的吗?这种方式是否需要使用poll_one()?
最佳答案 回覆.编辑:
你有正确的io_service :: run().这告诉我你在(完成)处理程序中阻止未来.显然,这会阻止run()进行事件循环.
@florgeng提出的问题不是你是否有一个io_service实例.
问题是你是否正在调用run()(或poll()),以便继续执行异步操作.
此外,您已经可以使用future<>内置:
> http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/cpp2011/futures.html
>示例:http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp
std::future<std::size_t> recv_length = socket.async_receive_from(
boost::asio::buffer(recv_buf),
sender_endpoint,
boost::asio::use_future);