[解決済み] coutは同期化/スレッドセーフですか?
質問
一般に、ストリームは同期されないと仮定して、適切なロックを行うのはユーザ次第です。しかし、以下のようなことは可能でしょうか?
cout
のようなものは、標準ライブラリで特別な扱いを受けるのでしょうか?
つまり、もし複数のスレッドが
cout
を破損させることができるでしょうか?
cout
オブジェクトを破損することはないのでしょうか?同期してもランダムにインターリーブされた出力が得られることは理解できますが、そのインターリーブは保証されているのでしょうか。つまり
cout
を複数のスレッドから使用しても安全なのでしょうか?
これはベンダ依存ですか?gccはどうなっているのでしょうか?
重要 : もしあなたが「はい」と答えた場合、何らかの証拠が必要ですので、何らかの参考資料を提示してください。
私の懸念は、基礎となるシステムコールについてではなく、それらは問題ありませんが、ストリームはその上にバッファリングのレイヤーを追加します。
どのように解決するのですか?
C++03標準では、それについて何も言っていません。スレッドセーフであることが保証されていない場合は、スレッドセーフでないものとして扱う必要があります。
ここで特に興味深いのは
cout
がバッファリングされていることです。たとえ
write
(またはその特定の実装でその効果を達成するものが何であれ) の呼び出しが相互に排他的であることが保証されている場合でも、バッファは異なるスレッドによって共有されるかもしれません。これは、ストリームの内部状態の破損にすぐにつながります。
また、バッファへのアクセスがスレッドセーフであることが保証されている場合でも、このコードでは何が起こると思いますか?
// in one thread
cout << "The operation took " << result << " seconds.";
// in another thread
cout << "Hello world! Hello " << name << "!";
おそらく、ここにある各行が相互に排他的に動作するようにしたいのでしょう。しかし、実装はどのようにそれを保証できるでしょうか?
C++11では、いくつかの保証があります。FDISでは§27.4.1 [iostream.objects.overview]で次のように書かれています。
同期 (§27.5.3.4) 標準 iostream オブジェクトのフォーマットされた入力 (§27.7.2.1) とフォーマットされていない出力 (§27.7.3.1) の関数や標準 Cストリームへの複数のスレッドによる同時アクセスは、データ競合 (§1.4.2) を生じてはならない。 は、データ競合(§1.10)を生じてはならない。[注意:複数のスレッドによるこれらのオブジェクトやストリームの同時使用を避けたい場合、ユーザは同期をとる必要があります。 注意:インターリーブ文字を避けるためには,利用者は,複数のスレッドによるこれらのオブジェクト及びストリームの同時使用を同期させなければならない。- エンドノート ]。
そのため、破損したストリームを得ることはありませんが、出力がゴミにならないようにするには、手動で同期させる必要があります。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み】 errnoはスレッドセーフですか?
-
[解決済み】メンバ関数でスレッドを開始する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない