All-Thread 静的変数
STATIC(*ALLTHREAD) キーワードを使用して変数を定義する場合、
変数がスレッド・セーフな方法で使用されるようにする責任があります。変数の有効範囲
および変数の使用法によって、変数へのアクセスを同期化するのに役立つ追加変数の設定が
必要になる場合があります。
- 変数が逐次化されたプロシージャーに対してローカルである場合、 逐次化のために一度に変数にアクセスできるスレッドは 1 つだけです。 そのため、余分な同期を追加する必要はありません。
- 変数がモジュールに対してグローバルであり、コードの 1 カ所でのみ変更されることを 保証でき、さらに他のスレッドが変数を使用するには、その前にその変数を変更するコードが実行されることを 保証できる場合、その変数に対する同期を追加する必要はありません。
- それ以外の場合、mutex またはセマフォーなどの同期技法で使用するように 追加の変数を追加する必要があります。http://www.ibm.com/systems/infocenter/ および 『スレッド関連の API の使用』で、スレッド に関する情報を参照してください。
他の変数へのアクセスを同期化するために同期変数を追加する必要がある場合、
以下のことを確認する必要があります。
- 同期変数は、変数へのアクセスが行われる前に初期化する必要があります。
- 変数を処理するときは、セマフォーまたは mutex をロックすることによって、 まず変数へのアクセスを取得する必要があります。変数の処理が終了したら、 セマフォーまたは mutex をアンロックする必要があります。
- 変数がモジュールからエクスポートされる場合、変数をインポートするすべての
モジュールも同期変数を使用できることを確認する必要があります。
これを行うには、同期変数をエクスポートするか、変数を使用する必要があるモジュールによって
呼び出すことが可能なエクスポート・モジュールにエクスポート済みのロックおよびアンロック・プロシージャーを追加します。
ヒント: 同期が必要な変数、および その同期変数またはロックおよびアンロック・プロシージャーに対して 命名規則を設定します。例えば、同期が必要な変数の先頭に SN_ を付け、 その同期変数またはプロシージャーに対して同じ名前を使用するが、異なる接頭部を使用するという規則を使用できます。 例えば、変数 SN_nextIndex は、ロックおよびアンロック・プロシージャー LOCK_nextIndex および UNLOCK_nextIndex を持つことができます。そのような規則を使用し、 さらにその使用を厳しく強制することによって、プログラマーが正しい同期プロトコルに従わずに、同期が必要な変数を使用する可能性を減らすことができます。
- デッドロック状態は回避する必要があります。例えば、1 つのスレッドが FLD1 に対してロックを持ち、FLD2 のロックを取得しようとし、別のスレッドが FLD2 のロックを持ち、FLD1 上でロックを取得しようとする場合、どちらのスレッドも 永遠に待機することになります。