共有配列バッファー(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
を作成し、それに 2バイト長×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