オブジェクトの状態
条件変数オブジェクト
条件変数は、ファイバー間で共有されるグローバル変数を使用して同期するメカニズムです。主に2つのアクションが含まれます。1)スレッドは特定の条件が確立されるのを待ってそれ自体を一時停止します。2)別のスレッドが条件を確立して通知します。下向きに実行する待機中のファイバー。
競合を防ぐために、各条件変数には1つ必要です。Lockマッチ (Lock明示的に作成して自分で渡すことも、fibjsで作成することもできます)
条件変数を使用することにより、1つの条件変数を使用してファイバーのバッチの切り替えを制御できます。
次に、ファイバースケジューリングの2つの例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21var coroutine = require("coroutine");
var cond = new coroutine.Condition();
var ready = false;
var state = "ready";
function funcwait() {
cond.acquire();
while (!ready)
cond.wait();
state = "go"
cond.release();
}
coroutine.start(funcwait);
cond.acquire();
console.log(state)
ready = true;
cond.notify();
coroutine.sleep();
console.log(state);
出力します:
1
2ready
go
継承
コンストラクタ
Condition
条件変数コンストラクター(条件変数に必要なロックはfibjsによって内部的に構築されます)
1new Condition();
条件変数コンストラクター
1new Condition(Lock lock);
呼び出しパラメーター:
- lock: Lock、自作のロックを使用する
メンバー関数
wait
ファイバーをブロッキング状態にします
1Condition.wait();
notify
ブロックされたファイバー(最後にファイバープールに追加されたファイバー)に通知して、実行を継続します。
1Condition.notify();
notifyAll
ブロックされたすべてのファイバーに、下向きに実行を続行するように通知します
1Condition.notifyAll();
acquire
ロックの所有権を取得する
1Boolean Condition.acquire(Boolean blocking = true);
呼び出しパラメーター:
- blocking:ブール値、待機するかどうかを指定します。trueの場合、待機します。デフォルトはtrueです。
戻り結果:
- Boolean、ロックが正常に取得されたかどうかを返します。trueは取得が成功したことを意味します
取得メソッドは、ロックの所有権を取得するために使用されます。ロックが取得可能な状態にある場合、このメソッドはすぐにtrueを返します。
ロックが使用できず、ブロッキングがtrueの場合、現在のファイバーはスリープ状態になります。他のファイバーがロックを解除すると、このメソッドはtrueを返します。
ロックが使用できず、ブロッキングがfalseの場合、メソッドはfalseを返します。
release
ロックの所有権を解放する
1Condition.release();
このメソッドはロックの所有権を解放します。現在のファイバーがロックを所有していない場合、このメソッドはエラーをスローします。
count
現在待機中のタスクの数を照会する
1Integer Condition.count();
戻り結果:
- Integer、タスクの数を返します
toString
オブジェクトの文字列表現を返します。通常は「[NativeObject]」を返します。オブジェクトは、独自の特性に従って再実装できます。
1String Condition.toString();
戻り結果:
- String、オブジェクトの文字列表現を返します
toJSON
オブジェクトのJSON形式の表現を返します。通常、オブジェクトによって定義された読み取り可能な属性のコレクションを返します。
1Value Condition.toJSON(String key = "");
呼び出しパラメーター:
- key:文字列、未使用
戻り結果:
- Value、シリアル化可能なJSONを含む値を返します