Atomics.wait()

Baseline 已廣泛支援

此功能已成熟,可在多種裝置和瀏覽器版本上使用。自 2021 年 12 月以來,它已在所有瀏覽器中可用。

靜態方法 Atomics.wait() 驗證共享記憶體位置是否包含給定值,如果是,則進入休眠狀態,等待喚醒通知或超時。它返回一個字串:如果記憶體位置與給定值不匹配,則返回 "not-equal";如果被 Atomics.notify() 喚醒,則返回 "ok";如果超時,則返回 "timed-out"

Atomics.wait()Atomics.notify() 一起用於實現基於共享記憶體中值的執行緒同步。如果同步值已更改,執行緒可以立即繼續執行;或者,當到達同步點時,它可以等待來自另一個執行緒的通知。

此方法僅適用於檢視 SharedArrayBufferInt32ArrayBigInt64Array。它是阻塞式的,不能在主執行緒中使用。對於此方法的非阻塞、非同步版本,請參閱 Atomics.waitAsync()

語法

js
Atomics.wait(typedArray, index, value)
Atomics.wait(typedArray, index, value, timeout)

引數

typedArray

一個檢視 SharedArrayBufferInt32ArrayBigInt64Array

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

在以下情況之一中丟擲

RangeError

如果 indextypedArray 中超出界限,則丟擲。

示例

使用 wait()

給定一個共享的 Int32Array

js
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

讀取執行緒正在休眠,並在位置 0 上等待,因為提供的 value 與在提供的 index 處儲存的值匹配。讀取執行緒將不會繼續執行,直到寫入執行緒呼叫了在提供的 typedArray 的位置 0 上的 Atomics.notify()。請注意,如果在被喚醒後,寫入執行緒沒有改變位置 0 的值,讀取執行緒將不會重新進入休眠,而是會繼續執行。

js
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123

寫入執行緒儲存一個新值,並在寫入後通知等待執行緒

js
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);

規範

規範
ECMAScript® 2026 語言規範
# sec-atomics.wait

瀏覽器相容性

另見