データ属性の使用

データ項目の属性は、そのデータ項目にアクセスするスレッドで競合が発生するかどうかを決定します。スレッドは次のデータ項目に対しては競合しません。

プログラムで定義された他のデータ項目はスレッド間で共有されるため、競合が発生する可能性があります。次の場合に競合が発生することがあります。

通常、局所記憶節で定義されたデータは、再帰的な COBOL プログラムで使用されます。プログラムが再帰的に呼び出されるたびに、このデータのインスタンスが新規にスタックに割り当てられます。マルチスレッド アプリケーションの各スレッドは独自のスタックを持っているので、この属性は、再入可能なプログラムで競合しない一時的な作業項目を定義するのに理想的です。設計によっては、再入可能な COBOL プログラムを 1 つのスレッド内で再帰的に使用できます。

局所記憶節で定義されたデータの欠点は、再入可能または再帰的なプログラムが終了するとデータ項目を見失うことです。プログラムの終了後に再度そのプログラムを開始すると、局所記憶節で定義されたデータ項目の値は未定義になります。スレッドの要請により複数の呼び出しについてプログラムで状態を保存する必要がある場合は、別の機構を使用する必要があります。

これらの問題は、スレッド局所記憶節または THREAD-LOCAL 属性により、スレッド局所として定義されたデータを使用すると解決します。スレッド局所データは各スレッドに対して一意で、呼び出し全体に対して固定されているため、value 句で初期化できます。スレッド局所データは、スレッド固有の作業場所節のデータ項目として表示できます。この固定データは、ほとんどの再入可能なプログラムでの競合問題を解決するのに非常に役立ちます。多くの場合は、ファイル処理を行わないプログラムで作業場所節見出しをスレッド局所記憶節見出しに変更するのみで、完全に再入可能なプログラムにできます。読み込み専用の定数はすべて作業場所節で、読み書きデータはすべてスレッド局所記憶節で定義すると、データの割り当てを微調整できます。

スレッド局所データの欠点は次のとおりです。

スレッドではプライベートなデータ以外のデータが必要となることがあります。大部分のマルチスレッド アプリケーションは、厳密なプロトコルのもとで各スレッドがアクセスする共有データを使用して通信し合い、スレッドの実行を調整します。COBOL では、競合によるデータの破壊を防ぐさまざまな同期プリミティブと作業場所節またはファイル節のデータを併用することで、これを実現します。同期プリミティブの詳細については、次を参照してください。