オブジェクトロック
ロックは、ファイバーへの同時アクセスを制御するために使用できる組み込みオブジェクトです。1 つのファイバーを通じてロックを取得し、他のファイバーが同時にロックを取得するのを防ぐことができます。ロックは通過可能coroutine.Lock() 関数の作成
一般的な状況は、マルチスレッドのシナリオで、複数のスレッドが同じデータを変更しようとすると、データの不整合が発生することです。たとえば、2 つのスレッドが同じデータ内の同じ値を変更したい場合、制御が不適切だと結果が矛盾する可能性があります。このとき、Lock オブジェクトを使用すると、同じデータへの相互排他アクセスを実現できます。
以下は、Lock を使用して 2 つのファイバーの交互実行を実装する簡単な例ですが、共有変数 v の値は 300 ではありません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var coroutine = require("coroutine")
var l = new coroutine.Lock()
var v = 100
function f() {
l.acquire()
v = 200
coroutine.sleep(1)
v = 300
l.release()
}
coroutine.start(f)
coroutine.sleep(1)
l.acquire()
assert.notEqual(300, v)
assert.equal(200, v)
l.release()
まず、Lock オブジェクトが作成され、ファイバー f に入り、ロックを取得し、変数 v を変更して、ロックを解放します。メイン スレッドで、ファイバー f が完了するのを待ちます...ファイバー f がロックを解放すると、メイン スレッドはロックの取得を開始し、変数 v の値が 300 に変更されることを確認します。
相続関係
コンストラクタ
Lock
コンストラクタ
1new Lock();
メンバー関数
acquire
ロックの所有権を取得する
1Boolean Lock.acquire(Boolean blocking = true);
呼び出しパラメータ:
- blocking: ブール値、待機するかどうかを指定します。true の場合は待機します。デフォルトは true
返される結果:
- Boolean、ロックが正常に取得されたかどうかを返します。true は取得が成功したことを示します。
取得メソッドは、ロックの所有権を取得するために使用され、ロックが取得可能な状態にある場合、このメソッドはすぐに true を返します。
ロックが取得できず、ブロッキングが true の場合、現在のファイバーはスリープ状態になり、他のファイバーがロックを解放すると、このメソッドは true を返します。
ロックを取得できず、ブロッキングが false の場合、メソッドは false を返します。
release
ロックの所有権を解放する
1Lock.release();
このメソッドはロックの所有権を解放するか、現在のファイバーがロックを所有していない場合はエラーをスローします。
count
現在待機中のタスクの数を問い合わせる
1Integer Lock.count();
返される結果:
- Integer、タスクの数を返します
toString
オブジェクトの文字列表現を返します。通常、「[Native Object]」が返されます。オブジェクトは、独自の特性に従って再実装できます。
1String Lock.toString();
返される結果:
- String、オブジェクトの文字列表現を返します。
toJSON
オブジェクトの JSON 形式表現を返します。通常は、オブジェクトによって定義された読み取り可能なプロパティのコレクションを返します。
1Value Lock.toJSON(String key = "");
呼び出しパラメータ:
- key: 文字列、使用されません
返される結果:
- Value、シリアル化可能な JSON を含む値を返します