如何用异步库实现忙信号?

时间:2017-02-12 21:31:01

标签: c++ asynchronous boost-asio

我正在使用Boost.Asio,但这个问题应该涵盖任何异步框架。

我有一个通过网络发送和接收数据的类。我想给我的用户提供读写方法和一个is_busy(),以便他们检查数据何时可用。现在我有write方法的完成处理程序触发后台线程,读取并返回到将来,而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;
      });
});

1 个答案:

答案 0 :(得分:1)

我通过使用asio::socket_base::bytes_readable来修复此问题,以检查套接字中是否有数据准备好被读取,如果字节数为0,我只是睡了一定量的微秒。