1
我使用Boost.Asio,但這個問題應該涵蓋任何異步框架。如何使用異步庫實現繁忙信號?
我有一個通過網絡發送和接收數據的類。我想給我的用戶讀取和寫入方法以及一個is_busy()讓他們檢查數據何時可用。現在,我有寫方法的完成處理程序觸發一個後臺線程,讀取並返回未來,而read()方法從未來讀取。 write方法將bool設置爲true,並且在返回數據時讀取線程將其設置爲false。
有沒有更好的方法?如果我使用Asio正確理解它,我需要完成處理程序,但沒有辦法告訴我的用戶數據還沒有抵達,沒有阻塞。
更新
代碼示例:
void Socket::write(const vector<byte> input) {
busy_ = true;
read_buffer_.clear();
socket_->async_write_some(asio::buffer(input), [&](const std::error_code ec, const size_t length) {
if (ec && ec != asio::error::operation_aborted) {
throw std::system_error(ec);
}
if (ec == asio::error::operation_aborted) {
return;
}
read_f = std::async(std::launch::async, [&]() {
socket_->async_read_some(asio::null_buffers(), [&](const std::error_code ec, const size_t length) {
if (ec && ec != asio::error::operation_aborted) {
throw std::system_error(ec);
}
if (ec == asio::error::operation_aborted) {
return;
}
read_buffer_.resize(socket_->available());
socket_->read_some(asio::buffer(read_buffer_));
busy_ = false;
});
unsigned long a = service_.run();
service_.reset();
busy_ = false;
return a;
});
});
請提供未來閱讀和寫作的代碼。 – stark
@stark添加代碼示例。 – ruipacheco
協程似乎是這裏更簡單的方法。 – Arunmu