この記事は編集レビューを必要としています。ぜひご協力ください。
これは実験段階の機能です。
この機能は複数のブラウザで開発中の状態にあります。互換性テーブルをチェックしてください。また、実験段階の機能の構文と挙動は、仕様変更に伴い各ブラウザの将来のバージョンで変更になる可能性があることに注意してください。
SharedArrayBuffer オブジェクトは、ジェネリックで固定長の生バイナリデータバッファを表すために使用されます。ArrayBuffer オブジェクトと似ていますが、これらは共有メモリ上にビューを生成するために使用されます。ArrayBuffer と異なり、 SharedArrayBuffer は分離できません。
構文
new SharedArrayBuffer(length)
パラメーター
length- array buffer を生成するバイト単位のサイズ。
戻り値
指定したサイズの新しい SharedArrayBuffer。コンテンツは 0 に初期化されている。
説明
ArrayBuffer vs SharedArrayBuffer
JavaScript は、ArrayBuffer と SharedArrayBuffer オブジェクトを提供しています。これらは、次のように生成されます:
var ab = new ArrayBuffer(1024); var sab = new SharedArrayBuffer(1024);
Web コンテンツは、バックグラウンドスレッドでスクリプトを実行するために、 Web Worker を使用します。worker からのデータの送受信は、postMessage() メソッドによって行われ、transferable object と呼ばれる特定の種類のオブジェクトは、あるコンテキストからほかのコンテキストにコピー操作なしのハイパフォーマンスで転送されます。
メインアプリから worker スクリプトに ArrayBuffer を転送する場合、オリジナルの ArrayBuffer はクリアされて使用できなくなります。そのコンテンツは(文字通り) worker コンテクストに転送されます。
var ab = new ArrayBuffer(1024);
var uInt8Array = new Uint8Array(ab);
for (var i = 0; i < uInt8Array.length; ++i) {
uInt8Array[i] = i;
}
var worker = new Worker("worker.js");
// 転送前
console.log(uInt8Array.byteLength); // 1024
worker.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);
// 転送後
console.log(uInt8Array.byteLength); // 0
SharedArrayBuffer の場合、同じ postMessage() を呼び出して転送することで、worker とこのメモリをシェアできます。
var sab = new SharedArrayBuffer(1024); // 転送前 console.log(sab.byteLength); // 1024 worker.postMessage(sab, [sab]); // 転送後 console.log(sab.byteLength); // 1024
Atomic 操作で共有メモリを更新、同期する
共有メモリは、worker 内でもメインスレッド内でも同時に生成や更新ができます。システム(CPU や OS、ブラウザ)のよっては、変更がすべてのコンテキストに通知されるまでに少々時間がかかります。同期するためには、atomic 操作が必要です。
SharedArrayBuffer オブジェクトを受け付ける API
WebGLRenderingContext.bufferData()WebGLRenderingContext.bufferSubData()WebGL2RenderingContext.getBufferSubData()
生成には new 演算子が必要
SharedArrayBuffer コンストラクタは、new 演算子で呼び出される必要があります。new 演算子なしで関数として SharedArrayBuffer コンストラクタを呼び出すと、TypeError をスローします。
var sab = SharedArrayBuffer(1024); // TypeError: calling a builtin SharedArrayBuffer constructor // without new is forbidden
var sab = new SharedArrayBuffer(1024);
プロパティ
SharedArrayBuffer.lengthSharedArrayBufferコンストラクタの length プロパティの値は 1。SharedArrayBuffer.prototype- すべての
SharedArrayBufferオブジェクトにプロパティ追加を許可する。
SharedArrayBuffer プロトタイプオブジェクト
すべての SharedArrayBuffer インスタンスは SharedArrayBuffer.prototype を継承しています。
プロパティ
- SharedArrayBuffer.prototype.constructor
- Specifies the function that creates an object's prototype. The initial value is the standard built-in
SharedArrayBufferconstructor. SharedArrayBuffer.prototype.byteLengthRead only- The size, in bytes, of the array. This is established when the array is constructed and cannot be changed. Read only.
メソッド
SharedArrayBuffer.prototype.slice(begin, end)- Returns a new
SharedArrayBufferwhose contents are a copy of thisSharedArrayBuffer's bytes frombegin, inclusive, up toend, exclusive. If eitherbeginorendis negative, it refers to an index from the end of the array, as opposed to from the beginning.
仕様
| 仕様 | 状態 | コメント |
|---|---|---|
| ECMAScript Shared Memory and Atomics SharedArrayBuffer の定義 |
ドラフト | 初期定義。 |
ブラウザ実装状況
| 機能 | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基本サポート | 未サポート [2] | 未サポート | 46 (46) [1] 47 (47) |
未サポート | 未サポート | 未サポート |
slice() |
未サポート | 未サポート | 未サポート | 未サポート | 未サポート | 未サポート |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | 未サポート | 未サポート | 46.0 (46) [1] | 未サポート | 未サポート | 未サポート |
slice() |
未サポート | 未サポート | 未サポート | 未サポート | 未サポート | 未サポート |
[1] この機能は、環境設定で無効になっています。about:config で、javascript.options.shared_memory を true に設定してください。
[2] この実装は開発中で、これらのランタイムフラグが必要です:--js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer
関連項目
AtomicsArrayBuffer- JavaScript typed arrays
- Web Workers
- parlib-simple – 同期と作業分配抽象化を提供するシンプルなライブラリ
- 共有メモリ – 簡潔なチュートリアル