5

そのため、データが存在するかどうかを常にチェックせずに、(たとえば) C++ 文字列ストリームからのデータを待機する方法を理解しようとしていますが、これはかなり CPU を消費します。

たとえば、シリアルデバイスから読み取り、データが到着しない間プロセスをロックすることは完全にできますが、残念ながらC++ストリームでそれを行う方法を理解できませんでした.

cin はまさにそれを行っているため、つまり、return キーが istream の読み取りから抜け出すのを待っているため、何かが欠けていると確信していますが、どのようにそれを行うのでしょうか?

この件についての光を前もってありがとう。

4

2 に答える 2

3

ストリームは からデータを取得しますstd::streambuf。その場合、オペレーティング システムからデータが渡されるまでブロックするstd::cinシステムの関数 (または同等の関数) を呼び出します。read()コンソールは通常、完全な行を送信します。文字列ストリームには、新しいデータを取得するという概念がありません。つまり、現在のデータの最後に到達すると失敗します。ブロックするという概念はありません。

何をしているのかはよくわかりませんでしたが、その音から、2 つのスレッド間でデータを通信しようとしています。1 つは読み取りと、データが使用可能になるまでブロックする可能性があり、もう 1 つはさらにデータを入力します。対応するストリーム バッファを非常に簡単に作成できます。データがない場合は条件変数で作成std::streambuf::underflow()します。バッファを適切に設定し、条件変数を通知します。明らかに、必要な同期が必要です。ただし、読み取りと書き込みのほとんどは同期を行っていません。これは事実上、入力と出力用に 2 つの別個のバッファーが必要になり、データを にコピーする必要があることを意味します。wait()std::streambuf::overflow()std::streambuf::underflow()

于 2012-09-10T12:13:30.563 に答える
1

できません。std::stringstreamそれ以上のデータがないことを知る唯一の方法は、ストリームにデータがないことです。

しかし、それは興味深い考えです。 <<on はstd::stringstream 、書き込み側が閉じられている場合にのみ true を返します。アイデアの唯一の問題は、std::stringstreamオープンまたはクローズのアイデアがないことです。

ただし、本当の問題は、何を達成しようとしているのかということです。 std::stringstreamプロセスで動作し、その場合、フォーマット (一般的な iostream の抽象化) の必要はありません。に生のオブジェクトを詰め込むだけですstd::deque。フォーマットについて心配する必要があるのは、外部と通信するときだけです。 たとえば、ファイルやその他のソースからstd::istringstream文字列を取得する場合に非常に便利です。std::getline同様に、std::ostringstream何らかの文字列を必要とする外部ソースのデータをフォーマットする場合に便利です。しかし、私はstd::stringstream;の用途を見つけたことがありません。直交性の理由からもっとあると思います。

于 2012-09-10T12:13:00.987 に答える