2009-09-27 12 views
10

私は現在C++内のスレッドの概念がないことを知っているが、this article is sayingC++の標準出力ストリームはスレッドセーフ(cout、cerr、clog)ですか?

タイプセーフ、スレッドセーフ、 ポータブルロギングメカニズム

.....

fprintf()関数はスレッドセーフです このログを別のスレッド から使用しても出力行 はスクランブルされません。

coutcerrclogは?

この質問は、fstreamstringstreamのように、C++のすべての種類のストリームタイプにも当てはまると思います。

+2

[注:答えは "yes"、C++ 11](http://stackoverflow.com/a/6374525/87234)です。 – GManNickG

+0

@GManNickG:Visual Studio 2013 C++を使用していますが、依然としてスレッドセーフではありません。画面上のアウトプットは、ほとんどが壊れている/混在しています。 –

+0

@MehmetFide:スレッドセーフティは、同期(混合/インターリーブされた文字列)とは異なります。複数の 'operator <<'呼び出しが同期されていることを確認する間に、実装が異なるスレッドからこれらのオブジェクトを使用する際にデータ競合に至らないことをC++ 11の標準的な保証人に示します。 – legends2k

答えて

8

この記事では、fprintf APIのPOSIX標準に関する主張をしています。それはC++ストリームについては何も言わない。これらのストリームにはそのような保証はないので、これはかなり正しいです。

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

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

9

これは実装固有の詳細です。実行時ライブラリYを持つCompiler Xにスレッドセーフの標準ストリームがあるかどうかを確認できますが、実装がスレッドの安全性に関して異なることが許されているため、すべての実装がそうであるかどうか尋ねることはできません。これは、C++にスレッドの組み込みの概念がないということの一部です。それはすべて実装固有です。

+0

私はそれも考えています:)しかし、記事ではコードも移植性があると主張しています! – AraK

+2

私は、この記事の著者が単に試してみるとどこでも動作すると言っていると思います。彼は、おそらく、HomeGrownRTOS v1.2のKeil Cや他の多くの組み合わせを試していないでしょう。 –

+0

この記事では、C++ストリームについては言及していません。 –

3

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

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

関連する問題