Atomics.wait()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2021年12月.
Atomics.wait() 静的メソッドは、共有メモリー位置に指定された値が含まれていることを確認し、含まれている場合は、覚醒通知またはタイムアウトを待つために休眠します。メモリー位置が指定された値と一致しない場合は "not-equal"、 Atomics.notify() によって覚醒した場合は "ok"、タイムアウトが切れた場合は "timed-out" という文字列を返します。
Atomics.wait() と Atomics.notify() は、共有メモリー内の値に基づいてスレッドの同期ができるようにするために一緒に使用されます。スレッドは、同期値が変更された場合、すぐに処理を続行することも、同期ポイントに到達したときに別のスレッドからの通知を待つこともできます。
このメソッドは、SharedArrayBuffer のビューである Int32Array または BigInt64Array でのみ動作します。これはブロッキング操作であり、メインスレッドでは使用できません。このメソッドの非ブロック、非同期バージョンについては、Atomics.waitAsync() をご覧ください。
構文
Atomics.wait(typedArray, index, value)
Atomics.wait(typedArray, index, value, timeout)
引数
typedArray-
SharedArrayBufferのビューであるInt32ArrayまたはBigInt64Array index-
待つ対象となる
typedArrayの中の位置。 value-
検査で期待される値。
timeout省略可-
待機時間(ミリ秒単位)。
NaN(およびNaNに変換される値、たとえばundefined)はInfinityになります。負の値は0になります。
返値
文字列で、 "not-equal", "ok", "timed-out" のいずれかです。
- 初期値
valueがindexに格納されている値と等しくない場合、"not-equal"が即座に返されます。 Atomics.notify()の呼び出しによって目覚めた場合、期待される値が変更されているかどうかに関係なく、"ok"が返されます。Atomics.notify()によって目覚めなかった場合、スリープ待機が指定したtimeoutを超えたときに"timed-out"が返されます。
例外
TypeError-
次のいずれかの場合に発生します。
typedArrayが、SharedArrayBufferのビューであるInt32ArrayまたはBigInt64Arrayでない場合。- 現在のスレッドをブロックできない場合(例えば、メインスレッドであるため)。
RangeError-
indexがtypedArrayの範囲を超えている場合に発生します。
例
>wait() の使用
次のような共有された Int32Array があったとします。
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
読み取りスレッドは、指定された value が指定された index に格納されている値と一致するため、位置 0 で休眠して待機しています。
書き込みスレッドが、指定された typedArray の位置 0 で Atomics.notify() を呼び出すまで、読み取りスレッドは移動しません。
覚醒した後、位置 0 の値が書き込みスレッドによって変更されていない場合、読み取りスレッドは休眠状態に戻らず、処理を続行することに注意してください。
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
書き手のスレッドは新しい値を格納し、待っているスレッドに書き込みが完了したことを知らせます。
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-atomics.wait> |
ブラウザーの互換性
Loading…