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 |
浏览器兼容性
加载中…