Я использую Boost.Asio, но этот вопрос должен охватывать любую асинхронную структуру.
У меня есть класс, который отправляет и получает данные по сети. Я хотел бы предоставить своим пользователям методы чтения и записи, а также функцию is_busy(), чтобы они могли проверять доступность данных. Прямо сейчас у меня есть обработчик завершения метода записи, запускающий фоновый поток, который читает и возвращается в будущее, в то время как метод read() читает из этого будущего. Метод записи устанавливает для логического значения значение 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;
});
});