私は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;
});
});
今後の読み書きのコードを入力してください。 – stark
@starkコードサンプルを追加しました。 – ruipacheco
ここではコルーチンがもっと簡単なアプローチだと思われます。 – Arunmu