C++ ライブラリ・リファレンス

大域データと静的データ

マルチスレッド対応のアプリケーションでは、大域データと静的データをスレッド間で安全に共有することができません。各スレッドは独立して実行されますが、大域データと静的データへのアクセスはプロセス内のスレッド間で共有されています。そのような共有オブジェクトをあるスレッドが変更すると、プロセス内のその他の全スレッドがその変更の影響を受け、必要な間同じ状態を保つことが期待できなくなります。C++ では、クラスオブジェクト (クラスのインスタンス) の状態はメンバー変数の値で示されます。したがって、そのクラスオブジェクトが共有されていれば、他のスレッドからも変更されてしまいます。

マルチスレッド対応のアプリケーションで iostream ライブラリを使用し、iostream.h をインクルードしている場合、標準ストリーム (cout、cin、cerr、clog) は、デフォルトで大域的な共有オブジェクトとして定義されます。iostream ライブラリは「MT-安全」なので、iostream オブジェクトのメンバー関数の実行中は、共有オブジェクトの状態は他のスレッドからのアクセスや変更から保護されています。ただし iostream オブジェクトの「MT-安全」が有効なのは、そのオブジェクトの公開メンバー関数の実行中に限られます。次の例を考えてみましょう。


	int c;
	cin.get(c);

このコードでスレッド A が get バッファから次の文字を取り出し、スレッド A のバッファーポインタを更新します。ところが、スレッド A の次の命令がやはり get の呼び出しであっても、文字シーケンスからその次の文字が取り出されるという保証は libC ライブラリにおいてはありません。なぜなら、スレッド A による 2 つの get の呼び出しの間に、たとえばスレッド B が get の呼び出しを行う可能性があるからです。

共有オブジェクトとマルチスレッドにおけるこのような問題を解決する方法については、「オブジェクトのロック」を参照してください。