向Worker共享SharedArrayBuffer的TypedArray视图,能否访问完整SharedArrayBuffer?
问题解答
能,Worker 可以访问该 TypedArray 对应的全部共享内存数据。
原因如下:
- 基于
SharedArrayBuffer创建的TypedArray并非数据存储容器,只是对底层共享内存的引用与访问接口,所有实际数据都存放在SharedArrayBuffer中。 - 通过
postMessage发送这个TypedArray时,浏览器不会复制底层的共享内存(这是SharedArrayBuffer的核心特性),Worker 端收到的TypedArray会直接指向同一块共享内存区域。 - 只要 Worker 端的
TypedArray视图参数(如数据类型、起始偏移量、长度)与主线程一致,就能直接访问全部数据;即便参数不同,也可通过重新创建视图的方式,访问共享内存内的任意合法区域。
举个实际代码示例:
主线程代码
// 创建1KB大小的共享内存 const sab = new SharedArrayBuffer(1024); // 创建Uint8类型的视图 const uint8Arr = new Uint8Array(sab); // 给所有位置填充数据255 uint8Arr.fill(255); // 发送视图到Worker const worker = new Worker('worker.js'); worker.postMessage(uint8Arr);
Worker 代码(worker.js)
self.addEventListener('message', (e) => { const receivedArr = e.data; // 访问并打印前10个元素 console.log(receivedArr.subarray(0, 10)); // 输出:Uint8Array(10) [255, 255, 255, 255, 255, 255, 255, 255, 255, 255] });
注意:使用 SharedArrayBuffer 需要浏览器满足跨源隔离条件,即服务器需设置 Cross-Origin-Opener-Policy: same-origin 和 Cross-Origin-Embedder-Policy: require-corp 这两个HTTP响应头,否则该特性会被浏览器禁用。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

