SharedArrayBuffer & Atomics
安全问题解决:https://web.dev/coop-coep/
Atomics:原子操作共享内存
wait() 和 wake() 方法采用的是 Linux 上的 futexes 模型(fast user-space mutex,快速用户空间互斥量),可以让进程一直等待直到某个特定的条件为真,主要用于实现阻塞。调用 wait 时,如果当前线程不允许阻塞,则会抛出异常(大多数浏览器都不允许在主线程中调用 wait(), node 中可以)。
multiple workers and shared memory to implement true parallel algorithms in JavaScript.
// 充分利用CPU多核心,而且相比多线程互相 postMessage 少了复制数据的操作。
// 为啥没有逻辑非?
// 只能一位一位操作?不能整个 buffer 替换?
var sab = new SharedArrayBuffer(1024);
var ta = new Uint8Array(sab);
Atomics.add(ta, 0, 12); // 进行加操作并返回旧值
Atomics.sub; // 进行减操作并返回旧值
Atomics.store; // 设置索引 0 位置的值,返回新值
Atomics.load(ta, 0); // 12, 读取索引 0 位置的值
Atomics.and // 进行与操作并返回旧值
Atomics.or // 进行或操作并返回旧值
Atomics.xor // 进行异或操作并返回旧值
Atomics.exchange // 设置索引 0 位置的值,返回旧值
Atomics.compareExchange // 如果指定位置的值符合预期则替换值
Atomics.isLockFree // 用于确定使用锁(?)还是硬件原子操作(?)
Atomics.await/notify // 等待一个位置被修改;修改完通知等待线程
共享使用:
Now with a SharedArrayBuffer, you can share this memory with the worker by transferring it using the same postMessage() call.
To synchronize, atomic operations are needed.
//////// main.js
let sab = new SharedArrayBuffer(1024);
let w = new Worker("...");
w.postMessage(sab, [sab]); // Transfer the buffer