11

現在のスレッドの概念がないことは知っていますがC++この記事では次のように述べています

タイプセーフ、スレッドセーフ、移植可能な ロギングメカニズム

.....

関数はスレッドセーフであるため、fprintf()このログが別のスレッドから使​​用された場合でも、出力行がスクランブルされることはありません。

coutはどうですか?cerrclog

この質問は、 や など、C++ のすべての種類のストリーム タイプにも当てはまると思いfstreamますstringstream

4

3 に答える 3

9

それは実装固有の詳細になります。ランタイム ライブラリ Y を備えたコンパイラ X にスレッド セーフな標準ストリームがあるかどうかを確認することはできますが、すべての実装にスレッド セーフな標準ストリームがあるかどうかを確認することはできません。これは、C++ に組み込みのスレッドの概念がないことの一部です。それはすべて実装固有です。

于 2009-09-27T11:48:04.177 に答える
9

fprintfこの記事では、 APIの POSIX 標準について主張しています。C++ ストリームについては何も述べていません。これらのストリームにはそのような保証がないため、これは非常に正しいです。

この記事のロギング クラスは C++ ストリーム構文を使用していますstd::ostringstreamが、ロギング イベントごとに作成および破棄されるオブジェクトを介してこれを行うため、スレッド間で共有されないことに注意してください。fprintf実際にコンテンツをコンソールに書き込むために使用します。

Microsoft C ライブラリは POSIX 準拠であると主張しているため、この記事のコードはおそらく非常に広く移植可能です (他の多くの一般的なオペレーティング システムは POSIX 準拠であるため)。ただし、これは、標準の C++ ストリームがスレッドセーフであることを意味するものではありません。

于 2009-09-27T11:54:14.340 に答える
2

現在のC++標準は、「スレッド」と呼ばれるものがあることさえ認めていないため、スレッドセーフに関する保証はまったくありません。

これはすべて実装定義です。

于 2009-09-27T12:11:12.637 に答える