THREAD(*CONCURRENT)

THREAD(*CONCURRENT) を指定すると、複数のスレッドをモジュールで同時に実行できるようになります。 デフォルトでは、モジュールの静的記憶域は、すべてスレッド・ローカル記憶域内にあります。 つまり、静的変数 (コンパイラー内部変数を含む) のコピーを、各スレッドがモジュール内に個別に持つことになります。 これによって、モジュール内で複数のスレッドがプロシージャーを同時に実行できるようになり、さらに各スレッドをそれぞれ完全に独立したものにすることができます。 例えば、プロシージャー PROCA において、あるスレッドがファイルを読み取るループの最中であるときに、同じプロシージャーの前半で別のスレッドを同時に実行して、そのスレッドで独自に使用するファイルをオープンする準備を行う、といったこともできます。 また、グローバル変数 NAME がモジュールに指定されている場合に、NAME の値を、あるスレッドでは「Jack」として、別のスレッドでは「Jill」とすることも可能です。 スレッド・ローカル静的変数を使用すると、複数のスレッドを独立して実行させることができます。

STATIC(*ALLTHREAD) キーワードを使用すると、静的変数の一部をすべてのスレッドで共用することができます。 このキーワードを使用する場合には、プロシージャーで記憶域がスレッド・セーフな方法で使用されるように対策を立てる必要があります。THREAD(*CONCURRENT | *SERIALIZE)を参照してください。

また、「プロシージャーの始め」の指定で SERIALIZE キーワードを指定することで、個々のプロシージャーへのアクセスを逐次化するという方法をとることもできます。 コードのセクションの特定部分で、一度に 1 つのスレッドのみがアクティブになるようにしたい場合には、そのコードを逐次化されたプロシージャーへ移動することができます。