c++ - 同步 boost ASIO : Asynchronous write,

标签 c++ c++11 asynchronous boost 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));

这个函数的目的是:

  1. 本质上使调用异步
  2. 保持界面不变

我实现的功能只是简单的使用了promise/future来模拟sync行为,后面我会修改(生效后)为可取消:

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()使函数执行并继续进行,但我不明白。这就是我打电话的方式 run()对于 io_service (在启动客户端之前):

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()正确。这告诉我你在(完成)处理程序中阻止了 future 。显然,这会阻止 run()从推进事件循环。


@florgeng 问的问题不是你是否有 io_service实例。

问题是你是不是调用run() (或 poll() )适合异步操作进行。

此外,您已经可以使用future<>内置:

std::future<std::size_t> recv_length = socket.async_receive_from(
      boost::asio::buffer(recv_buf),
      sender_endpoint,
      boost::asio::use_future);

关于c++ - 同步 boost ASIO : Asynchronous write,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44076517/

相关文章:

C++ 函数作用域静态变量究竟何时初始化?

c++ - 工作程序在 'clean machine' 上遇到非法指令错误?

c++ - CMAKE:在自定义命令运行后执行文件复制

c++ - 如何为 D3DXCreateTextureFromFileEx 方法设置图像资源路径?

c++ - 使用空参数包函数参数调用初始化列表中的函数

sockets - Boost.Asio 的 async_read_some 会是整个消息吗?

javascript - 为什么我的异步函数不与回调结合产生结果?

node.js - 我的两个变量有时不相等,但必须相等

C++ operator<< gtest AssertionFailure 编译错误

javascript - 运行 1000 个请求,以便一次只运行 10 个