簡體   English   中英

Boost ASIO:異步寫入,同步

[英]Boost ASIO: Asynchronous write, synchronously

我有一個程序(客戶端+服務器),可以正常運行,沒有問題:

boost::asio::write(this->socket_, boost::asio::buffer(message.substr(count,length_to_send)));

其中socket_boost::asio::ssl::stream<boost::asio::ip::tcp::socket>messagestd::string

我想使它更好並且不阻塞,所以我創建了一個可以代替它的函數,其名稱如下:

write_async_sync(socket_,message.substr(count,length_to_send));

該功能的目的是:

  1. 本質上使呼叫異步
  2. 保持接口不變

我實現的功能只是使用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<>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM