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 std::future<std::size_t> recv_length = socket.async_receive_from( boost::asio::buffer(recv_buf),sender_endpoint,boost::asio::use_future); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |