Atomics.load 不适合轮询,应配合 Atomics.wait 使用;轮询会耗尽 CPU、阻塞线程且低效,而 wait/notify 零开销、毫秒响应,并需确保 crossOriginIsolated 环境。
Atomics.load 本身不适合轮询,强行用会吃光 CPU、卡死线程,且根本达不到“高效”——它只该用在配合 Atomics.wait 的同步链路里。
轮询(polling)指 Worker 不停地调用 Atomics.load(view, index) 检查某个标志位是否变化。这看似简单,但问题严重:
Atomics.load 都是内存访问,无等待、无让出,纯空转 —— 在 4 核机器上可能把一个 Worker 线程跑满 100% CPUsetTimeout 或 await new Promise(r => setTimeout(r, 1)),也变成低效假轮询,延迟不可控、唤醒不及时Atomics.load 不触发任何通知机制,无法与生产者形成协作节奏,纯属单向瞎猜高效跨 Worker 协作不是“查”,而是“等”。Atomics.wait 让线程挂起,直到被明确唤醒,零 CPU 开销,毫秒级响应。
Atomics.wait(sharedView, 0, 0) —— 表示“等索引 0 变成非 0”Atomics.store(sharedView, 0, 1) 再紧跟着 Atomics.notify(sharedView, 0, 1)
Atomics.store(sharedView, 0, 0)),再回到 wait
Atomics.wait 只能在 Worker 中安全调用;主线程调用会直接抛 TypeError
别把所有状态塞进一个整数。多 Worker 协作时,内存布局混乱是竞态高发区:
Int32Array[0])专用于同步标志(0=空闲,1=就绪,2=忙)Int32Array[1])存数据长度,防止越界读取new Float64Array(sab, 8) 存计算结果Atomics.store,所有读取必须用 Atomics.load —— 即使只是读长度,也不能直接 view[1]
Atomics.compareExchange 加锁代码写得再对,环境不达标就全白搭。运行前务必确认:
Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: require-corp
crossorigin 属性,例如 <script src="worker.js" type="module" crossorigin></script>
http://localhost:8080 类地址;file:// 协议下 self.crossOriginIsolated 永远为 false
self.crossOriginIsolated,为 true 才能继续;否则 new SharedArrayBuffer() 会静默失败或报 SharedArrayBuffer is not defined
最容易被忽略的是:你以为自己在“轮询”,其实只是没意识到 Atomics.wait 才是唯一合理入口;而所有看似省事的“手动 sleep + load”组合,都在悄悄拖垮性能和可维护性。