逐次化されたプロシージャーが十分な保護を提供しない場合

グローバルな all-thread 静的変数を持っている場合、 その変数に対して逐次化された "get" および "set" プロシージャーを持つことによって、 その変数へのアクセスを適切に制御できように見える場合があります。しかし、プロシージャーは個々に逐次化され、 それぞれが独自の個別の制御メカニズムを持つため、 残念ながら、この方法では適切な保護は提供されません。1 つのスレッドが "get" プロシージャーを実行している場合、 別のスレッドは同時に "set" プロシージャーを実行することができます。

"get" および "set" プロシージャーを使用する場合、両方のプロシージャーに コードを追加して、変数へのアクセスを手動で同期化する必要があります。

別の方法では、1 つの get-set プロシージャーで "get" と "set" の両方を結合します。 これは、必要な関数を示すために別々のパラメーターを持つことができます。または、オプションのパラメーターを持つことができ、これが渡されると、"set" 関数を提供します。プロシージャーは常に値を戻すため、"get" 関数は常に提供されます。

ただし、単一の "get-set" プロシージャーを使用する場合でも、その変数に対して適切なスレッド・セーフティーが 提供されない場合があります。以前の値を使用して変数を変更する場合 (値を変数に追加するなど)、 変数の値を取得してから、同じステートメントで新規の値にそれを設定することで適切に対処できると 考える場合があります。 ただし、他のスレッドが、プロシージャーに対する 2 つの呼び出しの間に そのプロシージャーを呼び出す場合があります。この場合、プロシージャーに対する 2 番目の "set" 呼び出しは、 他のスレッドによって設定された値を誤って上書きします。

      // If myFld has the value 2 before this statement is run, the first call
      // would return 2.  The second call would set the value to 3.  If another
      // thread had set the value to 15 in between the calls, the second call 
      // should logically set it to 16, not to 3.
      getSetMyFld                    // second call to getSetMyFld, to set the value
             (getSetMyFld() + 1);    // first call to getSetMyFld, to get the value

変数に対して複数のアクセスを実行し、かつ操作の実行中に、他のスレッドがその変数を取得または設定できないようにする必要がある場合、何らかの手動同期を使用して、変数に対するすべてのアクセスを制御する 必要があります。その変数のユーザーはすべて、同じ同期メカニズムを使用する 必要があります。