あなたはスレッドを使用して非同期I/Oをシミュレートすることができますが、もっと重要なのは、次の2回の読み取りの間にミューテックスを共有しなければなりません/スレッドが別のを踏んですべての問題を避けるために、スレッドを書きますスレッドを作成し、別のスレッドの出力の上にコンソールに書き込みます。つまり、std::cout
,std::cin
,fprintf()
などはマルチスレッドセーフではないため、別の読み取りまたは書き込みが既に発生している間に読み取りまたは書き込みが行われる2つの操作の間に予測できないインターリーブパターンが得られます。書き込みの途中で読み込みを試みると簡単に終わることがあります。さらに、コンソールに入力を入力している間に、別の書き込みスレッドがコンソールに書き始める可能性があります。入力として入力しようとしています。
非同期の読み書きスレッドを適切に管理するには、読み込み用と書き込み用の2つのクラスを設定することをお勧めします。各クラスでは、読み込みスレッドの場合はメインスレッドが取り出すメッセージ(書き込みの可能性が高い場合はstd::string
)を格納し、書き込みスレッドの場合はメインスレッドがメッセージをプッシュするメッセージキューを設定します。 stdin
またはstd::cin
から読み取る前にプロンプトを表示するメインスレッドによってメッセージキューにプッシュメッセージがプッシュされ、プロンプトを出力できる特別なバージョンの読み取りスレッドを作成することもできます。次に、両方のクラスが共通のミューテックスまたはセマフォを共有して、I/Oの予測不能なインターリーブを防止します。いずれかのiostream
コールの前に共通のミューテックスをロックすることにより(その後にロックを解除する)、I/Oの予測不能なインターリーブが回避されます。各スレッドは、クラスの内部メッセージキューへのアクセスより排他性を維持するために使用できる各スレッドに固有の別のミューテックスを追加します。最後に、各クラスのメッセージキューをstd::queue<std::string>
として実装することができます。
可能な限りクロスプラットフォームとしてプログラムを作成したい場合は、Boost :: threadsまたは新しいC++ 0x std :: threadsライブラリを使用して実装することをお勧めします。
何 "奇妙なもの" を活用するには? – NPE
[恥知らずのプラグ](https://github.com/louisdx/schlagwetter):-) –
は、割り込みハンドラをシミュレートします。あなたは私が推測するのが良いだろう。 –