複数のスレッドでの同時実行

THREAD(*CONCURRENT) を指定する場合、2 つ以上のスレッドが同じモジュール、同じプロシージャー、または同じステートメントで異なるプロシージャーを実行できます。 2 つ以上のスレッドが同じモジュールまたは同じプロシージャーで実行されている場合、 それぞれデフォルトで、モジュールとそのプロシージャーに静的記憶域の独自のインスタンスを持ちます。この記憶域は、スレッド・ローカル記憶域と呼ばれます。 例えば、2 つのスレッドが以下のループで実行されている場合、 1 つのスレッドは、値 7 を持つ変数 "count" を使用して、ファイルの 20 番目のレコードを読み取った後、 "IF" ステートメントを処理することができます。 もう 1 つのスレッドは、値 1 を持つ変数 "count" を使用して、ファイルの 4 番目のレコードを読み取った後、 "READ" ステートメントを処理することができます。

     read rec ds;
     count = 0;
     dow not %eof(file);
	     if (ds.amtOwing > ds.max.Owing);
           handleAccount (ds);
           count += 1;
        endif;
        read rec ds;
     enddo;

STATIC(*ALLTHREAD) を使用して変数を定義することを選択した場合、 すべてのスレッドがその変数の同じインスタンスを使用します。

注意:
RPG は、2 つの スレッドが同時に all-thread 静的変数を変更しようとする動作、または別のスレッドがその値を検査しているときにあるスレッドが変数を変更しようとする動作に対して保護を提供しません。 詳しくは、All- Thread 静的変数を参照してください。

あるコードが一度に 1 つのスレッドによってのみ使用されるようにするには、 そのコードを逐次化プロシージャーに置くことができます (プロシージャー開始仕様書の SERIALIZE キーワード)。 逐次化された各プロシージャーには独自の逐次化メカニズムがあることに注意してください。 あるスレッドを逐次化された 1 つのプロシージャーで実行し、 別のスレッドを、同じモジュール内の逐次化された別のプロシージャーで実行することができます。

コードが一度に 1 つのスレッドによってのみ使用されるようにする他の方法は、 プロシージャー内のそのコードをスレッド逐次化モジュールに入れることです。