ストリーム・オブジェクトのスレッド・セーフティーの確保

iostream 標準ライブラリー内に宣言されているすべてのクラスは再入可能であり、 スレッド・セーフティーの確保のために単一ロックを使用し、同時にデッドロックの発生を防いでいます。 しかしながらマルチプロセッサー・マシンでは、稀ではありますが、2 つの別のスレッドが共用ストリーム・オブジェクトへのアクセスを同時に試みる、または ストリーム・オブジェクトがロックを掛けながら入力 (例えばキーボードから) を 待つなどの機会があります。 ライブ・ロック (livelock) の可能性を避けるには、コンパイル時に下記のマクロを使用して、入力ストリーム・オブジェクト、 出力ストリーム・オブジェクト、または両方のロッキングを使用不可に設定します。

__NOLOCK_ON_INPUT
入力ロッキングを使用不可にする。
__NOLOCK_ON_OUTPUT
出力ロッキングを使用不可にする。
これらのマクロの 1 つまたは両方を使う場合は、コンパイルのコマンド・ラインでマクロ名に -D オプションのプレフィックスを付けてください。 次に例を示します。
xlC_r -D__NOLOCK_ON_INPUT -D__NOLOCK_ON_OUTPUT a.C
あるいは、実行時に以下の環境変数を使用して、入力ストリーム・オブジェクト、 出力ストリーム・オブジェクト、またはその両方のロッキングを使用不可に設定できます。
XLCPP_NOLOCK_ON_INPUT
入力ロッキングを使用不可にする。
XLCPP_NOLOCK_ON_OUTPUT
出力ロッキングを使用不可にする。
例えば、次のコマンドを使用して、入力ストリーム・オブジェクトのロッキングを使用不可にできます。
export XLCPP_NOLOCK_ON_INPUT=1

ストリーム・オブジェクトのロッキングを使用不可にする場合、環境変数を使用することを推奨します。

ただし、入力オブジェクトまたは出力オブジェクトのロッキングを使用不可にする場合に、 ストリーム・オブジェクトがスレッド間で共用される場合、ソース・コード内で適切なロッキング・メカニズムを提供する必要があります。 それを行わないと、振る舞いは未定義で、データ破壊またはアプリケーション 異常終了の可能性があります。

注: OpenMP ディレクティブ、または -qsmp オプションを使用して、入出力ストリーム・オブジェクトを共用するコードの自動並列処理を行う場合、 ロック使用不可化マクロに関連して、Pthreads または他のマルチスレッド化構成をインプリメントし、 結果としてスレッドの同期化を必要とすることと同様なリスクを抱えることになります。