如何使用异步库实现忙碌信号?
How to implement busy signal with async library?
我正在使用 Boost.Asio 但这个问题应该涵盖任何异步框架。
我有一个 class 可以通过网络发送和接收数据。我想给我的用户提供读写方法和 is_busy() 以便他们检查数据何时可用。现在我有 write 方法的完成处理程序触发一个后台线程读取和 returns 到未来,而 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;
});
});
我通过使用 asio::socket_base::bytes_readable
检查套接字中是否有数据可以读取以及字节数是否为 0 来修复此问题,我只是休眠了一定的微秒。
我正在使用 Boost.Asio 但这个问题应该涵盖任何异步框架。
我有一个 class 可以通过网络发送和接收数据。我想给我的用户提供读写方法和 is_busy() 以便他们检查数据何时可用。现在我有 write 方法的完成处理程序触发一个后台线程读取和 returns 到未来,而 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;
});
});
我通过使用 asio::socket_base::bytes_readable
检查套接字中是否有数据可以读取以及字节数是否为 0 来修复此问题,我只是休眠了一定的微秒。