トランザクション内で、LOCKは、シリアライズする能力を確保するためGT.Mによって使用されます。トランザクションで保持しているLOCKを調べるために他のプロセスによる試みは、LOCKがトランザクションの外にいる時と同じ結果を生成することは、しかしながら、保証はありません。言い換えると、トランザクション内でLOCKは、シンプルセマフォとして使用しないでください。
LOCKコマンドは、ツリー構造の名前空間を制御する指定されたリソース名をLOCKクします。環境内で1つのプロセスがある時、トランザクションの外では、名前付きリソースでLOCKまたはZALLOCATEを取得し、最初のプロセスがそれが保持するLOCKを解放するまで、その環境内の他のGT.Mプロセスは、"重複:overlapping" の名前を持つリソースはLOCKできません。
トランザクション内でLOCKの使用方法については、 第5章: “Mの一般的な言語特徴”を参照してください。
LOCK コマンドの操作サマリ | ||
---|---|---|
コマンドの発行 |
LOCKの結果 |
コメント |
L |
none |
以前のすべてのロックを解除 |
L A |
A |
以前のLOCKを解除し、次に、AをLOCK |
L L +A |
A |
このシーケンスは、L A と同等です |
L A L -A |
none |
Aをロックする前に以前のロックを解除し、次にAのロックを解除します。これはL A Lと同等です。 |
L A L +A L -A |
A |
Aをロックする前に以前のロックを解除し、以前のAのロック解除なしでAをインクリメンタル ロックし、以前のAのロック解除なしでAをデクリメント ロックします。 |
L A L +B |
A,B |
Aをロックする前に以前のロックを解除し、次にAの解除なしでBをロックします。 |
L A,B |
B |
Aをロックする前に以前のロックを解除し、AをunLOCKし、次にBをロックします。 |
L (A,B) |
A,B |
AとBを同時にロックする前に以前のロックを解除します。 |
L A L +B L +C |
A,B,C |
Aをロックする前に以前のロックを解除し、Aの解除なしでBをロックし、AとBとを解除なしで C をロックします。 |
L A L +(B,C) |
A,B,C |
Aをロックする前に以前のロックを解除し、Aの解除なしでBとCを同時にロックします。 |
L (A,B,C) L -B L -C |
A |
AとBとCとを同時にロックする前に以前のロックを解除し、AとCとの解除なしでBをロックし、Aの解除なしで C のロックを解除します。 |
L (A,B,C) L -(B,C) |
A |
AとBとCとを同時にロックする前に以前のロックを解除し、Aの解除なしでBとC のロックを解除します。 |
L (A,B) L -B |
A |
AとBとを同時にロックする前に以前のロックを解除し、Aの解除なしでB のロックを解除します。 |
例:
Lock A,^B,@C Lock (A,B,@C)
最初のロックコマンドは、AをLOCKし、^BをLOCKする前にAのLOCKを解除します、次に、変数Cで指定された名前をロックする前に^Bのロックを解除します。2番目のLOCKコマンドは、一度に3つすべてのリソースを取得します。すべてのリソースをLOCKする前に、引数リスト内のすべての名前付きのリソースが利用可能になるまで、GT.Mは待機します。例えば、もし変数Cで指定されたリソースがLOCKするために利用できない場合、Aと^BをLOCKする前にそのリソースが利用可能になるまで、GT.Mは待機します。
例:
LOCK (A,B) LOCK +C LOCK -B
これはAとBとをLOCKし、次にCをインクリメンタルLOCKします。最後に、AとCのLOCKを保持しながら、BのLOCKを解放します。
例:
LOCK (A,B,C) LOCK +(B,C) LOCK -(B)
これは AとBとCを一緒にLOCKします。それは、BとCのロック "カウント" をインクリメントします。最後のLOCKコマンドは、Bの1つの"カウント" と、AとBとの1つのカウントを残したままで、Cの2つのカウントを解除します。
例:
LOCK ^D:5
このコマンドは、5秒のタイムアウトで ^DをLOCKしようとしています。もしタイムアウトが経過する前にLOCKが名前付きリソースを取得した場合、GT.Mは$TESTを1(TRUE)にセットします。もしタイムアウト時間が経過する前にLOCKが名前付きリソース取得に失敗した場合は、GT.Mは$TESTに 0(FALSE)をセットします。