オブジェクト条件
条件変数オブジェクト
条件変数とは、ファイバー間で共有されるグローバル変数を用いて同期を行う仕組みで、主に 1) スレッドがある条件が成立するのを待ってサスペンドする、2) 別のスレッドが条件を真にして通知する、という 2 つのアクションがあります。待機中のファイバーが下向きに実行されます。
競合状態を防ぐために、各条件変数には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
条件変数を待つ
1Boolean Condition.wait(Integer timeout = -1);
呼び出しパラメーター:
- timeout: 整数。ミリ秒単位でタイムアウト時間を指定します。デフォルトは -1 で、タイムアウトしないことを意味します。
戻り値:
- Boolean、取得が成功した場合は true を返し、タイムアウトの場合は false を返します
notify
ブロックされたファイバー (最後にファイバー プールに参加) に通知して、実行を下向きに続行する
1Condition.notify();
notifyAll
ブロックされたすべてのファイバーに下向きの実行を継続するよう通知する
1Condition.notifyAll();
acquire
ロックの所有権を取得する
1Boolean Condition.acquire(Boolean blocking = true);
呼び出しパラメーター:
- blocking: ブール値、待機するかどうかを指定、true の場合は待機、デフォルトは true
戻り値:
- Boolean、ロックが正常に取得されたかどうかを返します。 true は、ロックが正常に取得されたことを意味します
acquire メソッドはロックの所有権を取得するために使用され、このメソッドはロックが取得可能な状態になるとすぐに true を返します。
ロックを取得できず、blocking が true の場合、現在のファイバーは休止状態に入り、他のファイバーがロックを解除すると、このメソッドは true を返します。
ロックが利用できず、blocking が false の場合、メソッドは false を返します。
release
ロック所有権の解放
1Condition.release();
このメソッドは、ロックの所有権を解放するか、現在のファイバーがロックを所有していない場合はエラーをスローします。
count
現在待機中のタスク数を問い合わせる
1Integer Condition.count();
戻り値:
- Integer、タスクの数を返します
toString
オブジェクトの文字列表現を返します。通常は「[Native Object]」を返します。オブジェクトは独自の特性に従って再実装できます
1String Condition.toString();
戻り値:
- String、オブジェクトの文字列表現を返します
toJSON
オブジェクトの JSON 形式表現を返します。通常は、オブジェクトによって定義された読み取り可能なプロパティのコレクションを返します。
1Value Condition.toJSON(String key = "");
呼び出しパラメーター:
- key: 文字列、未使用
戻り値:
- Value、JSON シリアル化可能な値を返します