Atomics.wait()
靜態方法 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);
讀取執行緒正在休眠,並在位置 0 上等待,因為提供的 value 與在提供的 index 處儲存的值匹配。讀取執行緒將不會繼續執行,直到寫入執行緒呼叫了在提供的 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);
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-atomics.wait |
瀏覽器相容性
載入中…