2017-02-12 10 views
1

私は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; 
     }); 
}); 
+0

今後の読み書きのコードを入力してください。 – stark

+0

@starkコードサンプルを追加しました。 – ruipacheco

+0

ここではコルーチンがもっと簡単なアプローチだと思われます。 – Arunmu

答えて

1

私はデータが読み込み可能ソケットに存在しているかどうかをチェックするためにasio::socket_base::bytes_readableを使用し、バイト数がちょうどI 0である場合は、これを固定一定のマイクロ秒間スリープします。

関連する問題