共有配列バッファー(SharedArrayBuffer)
目次
SharedArrayBuffer とは
SharedArrayBufferは Web Worker、WebAssembly、WebGL などとデータを共有するために用いられる共有メモリです。ArrayBufferと同様、そのままではアクセスすることはできず、TypedArrayやDataViewにマッピングして使用します。- さらに、書込みや読込のアトミック性(*1)を保つために、
Atomicsを使用します。
*1) 処理の開始から終了までの間、他のスレッドの影響を受けず、また、影響を与えないこと。 - Spectre 対策として、下記の条件がそろっている場合のみ使用できます。
https://またはwss://で通信している。- ヘッダに
Cross-Origin-Opener-Policy: same-originが指定されている。 - ヘッダに
Cross-Origin-Embedder-Policy: require-corpが指定されている。
SharedArrayBuffer の作成
new SharedArrayBuffer(length, options)
共有配列バッファー(SharedArrayBuffer)を作成します。下記の例では 12 バイトの SharedArrayBuffer を作成し、それに ×ばつ6個の要素からなる Int16Array 型付き配列をマッピングしています。
const buf = new SharedArrayBuffer(12); const arr = new Int16Array(buf); console.log(arr);
SharedArrayBuffer の領域拡大
SharedArrayBuffer.byteLength
SharedArrayBuffer のサイズをバイト単位で返します。
const buf = new SharedArrayBuffer(12);
console.log(buf.byteLength); // => 12
maxByteLength
作成時に { maxByteLength: bytes } を指定することで、領域としては bytes バイトの領域をあらかじめ確保しておき、その範囲内で領域拡大可能な SharedArrayBuffer を作成することができます。プロパティ maxByteLength は作成時に指定した最大バイト数を返します。
const buf = new SharedArrayBuffer(12, { maxByteLength: 24 });
console.log(buf.byteLength); // => 12
console.log(buf.maxByteLength); // => 24
buf.grow(24);
console.log(buf.byteLength); // => 24
arrayBuffer.growable
ArrayBuffer が領域拡大可能な否かを true または false で示します。
const buf = new ArrayBuffer(12, { maxByteLength: 24 });
console.log(buf.growable); // => true
SharedArrayBuffer.grow(n)
SharedArrayBuffer を 現在のバイト数〜maxByteLength の範囲内で領域拡大します。ArrayBuffer は縮小することもできますが、SharedArrayBuffer は縮小することはできません。
const buf = new SharedArrayBuffer(12, { maxByteLength: 24 });
buf.grow(24);
SharedArrayBuffer の複製
SharedArrayBuffer.slice(start, end)
新しい SharedArrayBuffer を作成し、元のバッファーの start から end - 1 バイト目の値をコピーします。end を省略した場合は最後までをコピーします。下記の例では 6 バイトの SharedArrayBuffer を作成し、その 2 バイト目から 5 - 1 = 4 バイト目の 3バイトをコピーした新たな SharedArrayBuffer を作成しています。
const buf1 = new SharedArrayBuffer(6);
const arr1 = new Int8Array(buf1);
arr1.set([1, 2, 3, 4, 5, 6]);
const buf2 = buf1.slice(2, 5);
const arr2 = new Int8Array(buf2);
console.log(arr2); // => Int8Array(3) [3, 4, 5]
Copyright (C) 2025 杜甫々
改訂版初版:2025年6月22日、最終更新:2025年6月22日
https://www.tohoho-web.com/js/sharedarraybuffer.htm