c – Boost ASIO:异步写入,同步

我有一个程序(客户端服务器),该编写没有问题:

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);
点赞