オブジェクトセマフォ
ファイバーセマフォオブジェクト
セマフォ オブジェクトは内部カウンタを管理します。このカウンタは、acquire または wait を呼び出した後に 1 つ減り、release または post を呼び出した後に 1 つ増加します。取得および待機で値が 0 であることが判明すると、他のファイバーが解放またはポストを通じてカウンター値を増加させるまで、現在のファイバーがスリープ状態になるため、カウンターは負の数には減少しません。
セマフォが一般的に使用される機会は、リソースの同時使用とプロデューサー/コンシューマー モデルの適用を制限することです。
リソースの同時使用を制限するには、データベース リクエストを例に挙げます。
1
2
3
4
5
6
7
8
9
10var maxconnections = 5;
var l = new coroutine.Semaphore(maxconnections);
......
l.acquire();
var conn = connectdb()
.....
conn.close();
l.release();
プロデューサー/コンシューマー パターンでは、通常、キューを備えたセマフォが使用されます。プロデューサはキューにデータを追加してシグナルを送信し、コンシューマは最初にシグナルを待ち、シグナルを取得してから、キューに移動してデータをクエリします。
相続関係
コンストラクタ
Semaphore
セマフォコンストラクター
1new Semaphore(Integer value = 1);
呼び出しパラメータ:
- value: 整数、カウンタの初期値
メンバー関数
wait
セマフォを待つ
1Boolean Semaphore.wait(Integer timeout = -1);
呼び出しパラメータ:
- timeout: 整数。タイムアウトをミリ秒単位で指定します。デフォルトは -1 で、タイムアウトしないことを意味します。
返される結果:
- Boolean、取得が成功した場合は true を返し、タイムアウトした場合は false を返します。
post
release() と同等のセマフォを解放します。
1Semaphore.post();
trywait
シグナルの取得を試みます。取得できない場合は、すぐに戻り false を返します。これは、acquire(false) と同等です。
1Boolean Semaphore.trywait();
返される結果:
- Boolean、取得が成功した場合は true を返し、タイムアウトした場合は false を返します。
acquire
ロックの所有権を取得する
1Boolean Semaphore.acquire(Boolean blocking = true);
呼び出しパラメータ:
- blocking: ブール値、待機するかどうかを指定します。true の場合は待機します。デフォルトは true
返される結果:
- Boolean、ロックが正常に取得されたかどうかを返します。true は取得が成功したことを示します。
取得メソッドは、ロックの所有権を取得するために使用され、ロックが取得可能な状態にある場合、このメソッドはすぐに true を返します。
ロックが取得できず、ブロッキングが true の場合、現在のファイバーはスリープ状態になり、他のファイバーがロックを解放すると、このメソッドは true を返します。
ロックを取得できず、ブロッキングが false の場合、メソッドは false を返します。
release
ロックの所有権を解放する
1Semaphore.release();
このメソッドはロックの所有権を解放するか、現在のファイバーがロックを所有していない場合はエラーをスローします。
count
現在待機中のタスクの数を問い合わせる
1Integer Semaphore.count();
返される結果:
- Integer、タスクの数を返します
toString
オブジェクトの文字列表現を返します。通常、「[Native Object]」が返されます。オブジェクトは、独自の特性に従って再実装できます。
1String Semaphore.toString();
返される結果:
- String、オブジェクトの文字列表現を返します。
toJSON
オブジェクトの JSON 形式表現を返します。通常は、オブジェクトによって定義された読み取り可能なプロパティのコレクションを返します。
1Value Semaphore.toJSON(String key = "");
呼び出しパラメータ:
- key: 文字列、使用されません
返される結果:
- Value、シリアル化可能な JSON を含む値を返します