1
我打電話ASIO :: ASYNC_WRITE這樣:現在我是否需要在調用async_write時關心套接字的生命週期?
namespace asio = boost::asio;
using asio::ip::tcp;
using std::string;
shared_pointer<tcp::socket> tcp_socket_pointer;
string message;
...
void send() {
asio::async_write(
*tcp_socket_pointer,
asio::buffer(message),
boost::bind(
&handle_send, // defined elsewhere
asio::placeholders::error,
asio::placeholders::bytes_transferred)
);
}
,在我的代碼有可能是電話send
和handle_send
之間我通過插座被銷燬,因爲tcp_socket_pointer
超出它的範圍。
合法嗎?我的意思是,我是否需要確保引用的tcp :: socket持續存在,直到異步操作完成? 我的直覺告訴我,asio :: async_write立即進行系統調用,所以我不需要擔心,但我最好問:)。
如果它不能按我期望的那樣工作,將tcp_socket_pointer
作爲參數傳遞給handle_send
以確保它指向的tcp :: socket不會過期是個好主意嗎?
它會取消,但不會拋出運行時錯誤?這將是我想要的行爲:))。順便說一句,如何可以提高檢查套接字是否被破壞了一個普通的參考? – kitek 2014-09-03 17:21:16
@kitek它不能。在對象上調用析構函數時,它會在同一個對象上執行取消操作。如果你想查找一個套接字是否在不保存(共享)引用的情況下被銷燬,請使用'boost :: weak_ptr'(或'std :: weak_ptr') – sehe 2014-09-03 17:23:37
這就是困擾我的原因,因爲'async_write'是一個通用函數在while循環中工作直到寫入所有內容。因此,我擔心這個代碼可能會中斷。 – kitek 2014-09-03 17:34:05