📜  JavaScript | Atomics.wait() 方法(1)

📅  最后修改于: 2023-12-03 15:16:07.623000             🧑  作者: Mango

JavaScript | Atomics.wait() 方法

JavaScript | Atomics.wait() 方法是JavaScript中一个原子操作方法,它允许一个线程等待一个共享锁。

语法
Atomics.wait(typedArray, index, value[, timeout])
参数
typedArray

必需。一个类型化数组,它作为锁资源。

index

必需。 在typedArray中锁可用的位置。

value

必需。等待状态的目标值

timeout

可选。等待的时间值,以毫秒为单位。如果超时,返回timeout。如果未指定,默认值为Inifinity。

返回值

等待过程会阻塞当前线程,时间到了或等待原子变量的值不等于指定值,返回等待过程是否成功。

例子
let sharedBuffer = new SharedArrayBuffer(4);
let int32Array = new Int32Array(sharedBuffer);

//线程A修改数据
Atomics.store(int32Array, 0, 123);

//线程B等待数据修改完成
Atomics.wait(int32Array, 0, 123);

//线程C定时等待数据修改完成
setTimeout(()=>{
  Atomics.wake(int32Array, 0, 1); //唤醒线程B
}, 1000)

上面的代码中,线程A将int32Array第一个位置的值设置为123。然后线程B调用Atomics.wait()等待该值为123。线程C在1秒后调用Atomics.wake() 唤醒等待的线程B。

注意点
  1. Atomics.wait() 方法只能被用于使用了锁的typedArray上。
  2. Atomics.wait() 方法不能直接调用,必须在考虑到原子的情况下使用。
    • 勿为不遵循此种模式的库添加原子操作。
  3. Atomics.wait() 方法不会排队。它只返回成功或超时。
  4. Atomics.wait() 方法在任何线程阻塞时,不会允许其他线程进入类型化数组的对象呈现。这可能导致程序崩溃。
  5. Atomics.wait() 方法不应该与以下方法一起使用:
    • Atomics.store()
    • Atomics.exchange()
  6. Atomics.wait() 方法最有效的用例是在自旋锁(TypedArray)中使用,在非自旋锁中等待将触发非常大的过期和启动延迟。
结论

JavaScript | Atomics.wait() 方法提供了一种有效和安全的方法来等待共享资源的修改。它允许线程阻塞,直到共享数据被修改,从而避免了同时访问共享资源的竞争。尽管它的使用有一些限制,但它在使用自旋锁(TypedArray)时确实非常有效。