簡體   English   中英

boost::asio::async_write_some - 順序 function 調用

[英]boost::asio::async_write_some - sequential function call

我正在使用 boost.asio 編寫應用程序。 I've an object of type boost::asio::ip::tcp::socket and (of course) I've boost::asio::io_context which run 's function was called from only one thread. 將數據寫入套接字有幾種方法,但目前我使用套接字的 function async_write_some ,類似於下面的代碼:

void tcp_connection::write(packet_ptr packet)
{
    m_socket.async_write_some(boost::asio::buffer(packet->data(), packet->size()),
                              std::bind(&tcp_connection::on_write, this, std::placeholders::_1, std::placeholders::_2, packet));
}

boost::asio命名空間中還有另一個 function - async_write async_write的文檔說:

此操作通過對流的 async_write_some function 的零次或多次調用來實現,稱為組合操作。 程序必須確保 stream 不執行其他寫入操作(例如 async_write、流的 async_write_some function 或任何其他執行寫入的組合操作),直到此操作完成。

async_write_some的文檔中沒有這種“警告”。

這讓我有點困惑,在這里我有以下問題:

  1. 在不等待上一個調用完成的情況下調用async_write_some是否安全? 據我從 boost 的文檔中了解到的,我不應該使用async_write來做到這一點,但是async_write_some呢?
  2. 如果是,數據寫入套接字的順序是否與調用函數的順序相同? 我的意思是,如果我調用async_write_some(packet1)async_write_some(packet2) - 數據包是否會以相同的順序寫入套接字?
  3. 我應該使用哪個 function? 它們之間有什么區別?
  4. 前一個尚未完成時調用async_write不安全的原因是什么?
  1. 不; 其原因可能記錄在底層 sockets API (BSD/WinSock) 中。

  2. 不適用。 請注意,調用處理程序的順序保證與發布它們的順序相匹配,因此您可以使用async_write_some調用的異步鏈來解決它,其中完成處理程序發布下一次寫入。 這被稱為隱式鏈(請參閱https://www.boost.org/doc/libs/master/doc/html/boost_asio/overview/core/async.html以及為什么在使用 boost 時我需要每個連接的鏈: :asio? )。

  3. 99% 的時間,使用免費的 function。 不同之處在於它實現了組合操作來發送信息“單元”,即整個緩沖區、消息,或者直到滿足給定的完成條件。

    async_write_some是最低級別的構建塊,它甚至不能保證寫入所有數據: 備注

    寫入操作可能不會將所有數據傳輸到對等方。 如果您需要確保在異步操作完成之前寫入所有數據,請考慮使用async_write function。

  4. 從最嚴格的意義上說,這並不是不安全的¹。 它只是不會導致正確的結果:這是因為調用處理程序的順序導致數據以混合順序寫入套接字。


¹(除非您在沒有同步的情況下同時訪問共享的 IO 對象)

暫無
暫無

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

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