aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/global_objects/sharedarraybuffer/index.html
blob: 2603ebfbd17b3c166d6324afcd928c11c01b18f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
---
title: SharedArrayBuffer
slug: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer
tags:
  - Constructor
  - JavaScript
  - Shared Memory
  - SharedArrayBuffer
  - TypesdArrays
translation_of: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer
---
<div>{{JSRef}}</div>

<p><strong><code>SharedArrayBuffer</code></strong> オブジェクトは、ジェネリックで固定長の生バイナリデータバッファーを表すために使用されます。{{jsxref("ArrayBuffer")}} オブジェクトと似ていますが、これらは共有メモリー上にビューを生成するために使用されます。<code>ArrayBuffer</code> と異なり、<code>SharedArrayBuffer</code> は分離できません。</p>

<div class="note">
<p><code>SharedArrayBuffer</code> はすべての主要なブラウザーで 2018 年 1 月 5 日に、<a href="https://meltdownattack.com/">Spectre</a> への対応として無効化されましたので注意してください。Chrome では、Spectre 型脆弱性から保護するためのサイト分離機能が有効にされたプラットフォームにおいて、<a href="https://bugs.chromium.org/p/chromium/issues/detail?id=821270">v67 に再度有効化されています</a></p>
</div>

<div>{{EmbedInteractiveExample("pages/js/sharedarraybuffer-constructor.html")}}</div>



<h2 id="構文">構文</h2>

<pre class="syntaxbox">new SharedArrayBuffer(length)
</pre>

<h3 id="パラメーター">パラメーター</h3>

<dl>
 <dt><code>length</code></dt>
 <dd>array buffer を生成するバイト単位のサイズ。</dd>
</dl>

<h3 id="戻り値">戻り値</h3>

<p>指定したサイズの新しい <code>SharedArrayBuffer</code>。コンテンツは 0 に初期化されている。</p>

<h2 id="説明">説明</h2>

<h3 id="Allocating_and_sharing_memory" name="Allocating_and_sharing_memory">メモリーの割り当てと共有</h3>

<p>クラスター内のあるエージェントから別のエージェント (エージェントとは、ウェブページのメインプログラムまたはその web worker のひとつ) へ、{{jsxref("SharedArrayBuffer")}} オブジェクトを使用してメモリーを共有するために、<code><a href="/ja/docs/Web/API/Worker/postMessage">postMessage</a></code><a href="/ja/docs/Web/API/Web_Workers_API/Structured_clone_algorithm">structured cloning</a> を使用します。</p>

<p>structured clone アルゴリズムは <code>SharedArrayBuffers</code> と、<code>SharedArrayBuffers</code> にマッピングされた <code>TypedArrays</code> を受け入れます。どちらの場合も <code>SharedArrayBuffer</code> オブジェクトは受信者に転送されて、受信側のエージェントで新たなプライベートの SharedArrayBuffer オブジェクトになります ({{jsxref("ArrayBuffer")}} と同じように)。しかし、2 つの <code>SharedArrayBuffer</code> オブジェクトから参照される共有データブロックは同一のデータブロックであり、あるエージェントによるブロックへの副作用は、結果的に他方のエージェントからも見えます。</p>

<pre class="brush: js">var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
</pre>

<h3 id="Atomic_操作で共有メモリを更新、同期する">Atomic 操作で共有メモリを更新、同期する</h3>

<p>共有メモリーは、worker 内でもメインスレッド内でも同時に生成や更新ができます。システム(CPU や OS、ブラウザー)によっては、変更がすべてのコンテキストに通知されるまでに少々時間がかかります。同期するためには、{{jsxref("Atomics", "atomic", "", 1)}} 操作が必要です。</p>

<h3 id="SharedArrayBuffer_オブジェクトを受け付ける_API">SharedArrayBuffer オブジェクトを受け付ける API</h3>

<ul>
 <li>{{domxref("WebGLRenderingContext.bufferData()")}}</li>
 <li>{{domxref("WebGLRenderingContext.bufferSubData()")}}</li>
 <li>{{domxref("WebGL2RenderingContext.getBufferSubData()")}}</li>
</ul>

<h3 id="SharedArrayBuffer_の生成には_new_演算子が必要">SharedArrayBuffer の生成には new 演算子が必要</h3>

<p><code>SharedArrayBuffer</code> コンストラクターは、{{jsxref("Operators/new", "new")}} 演算子で呼び出される必要があります。<code>new</code> 演算子なしで関数として <code>SharedArrayBuffer</code> コンストラクターを呼び出すと、{{jsxref("TypeError")}} をスローします。</p>

<pre class="brush: js example-bad">var sab = SharedArrayBuffer(1024);
// TypeError: calling a builtin SharedArrayBuffer constructor
// without new is forbidden</pre>

<pre class="brush: js example-good">var sab = new SharedArrayBuffer(1024);</pre>

<h2 id="プロパティ">プロパティ</h2>

<dl>
 <dt><code>SharedArrayBuffer.length</code></dt>
 <dd><code>SharedArrayBuffer</code> コンストラクターの length プロパティの値は 1。</dd>
 <dt>{{jsxref("SharedArrayBuffer.prototype")}}</dt>
 <dd>すべての <code>SharedArrayBuffer</code> オブジェクトにプロパティ追加を許可する。</dd>
</dl>

<h2 id="SharedArrayBuffer_プロトタイプオブジェクト"><code>SharedArrayBuffer</code> プロトタイプオブジェクト</h2>

<p>すべての <code>SharedArrayBuffer</code> インスタンスは {{jsxref("SharedArrayBuffer.prototype")}} を継承しています。</p>

<h3 id="プロパティ_2">プロパティ</h3>

<p>{{page('ja/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','プロパティ')}}</p>

<h3 id="メソッド">メソッド</h3>

<p>{{page('ja/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','メソッド')}}</p>

<h2 id="仕様">仕様</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">仕様</th>
   <th scope="col">状態</th>
   <th scope="col">コメント</th>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td>ES2017 で初期定義。</td>
  </tr>
  <tr>
   <td>{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td>
   <td>{{Spec2('ES8')}}</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="ブラウザー実装状況">ブラウザー実装状況</h2>



<p>{{Compat("javascript.builtins.SharedArrayBuffer")}}</p>

<h2 id="関連項目">関連項目</h2>

<ul>
 <li>{{jsxref("Atomics")}}</li>
 <li>{{jsxref("ArrayBuffer")}}</li>
 <li><a href="/ja/docs/Web/JavaScript/Typed_arrays">JavaScript typed arrays</a></li>
 <li><a href="/ja/docs/Web/API/Web_Workers_API">Web Workers</a></li>
 <li><a href="https://github.com/lars-t-hansen/parlib-simple">parlib-simple </a>– 同期と作業分配抽象化を提供するシンプルなライブラリー</li>
 <li><a href="https://github.com/tc39/ecmascript_sharedmem/blob/master/TUTORIAL.md">共有メモリー – 簡潔なチュートリアル</a></li>
 <li>
  <p><a href="https://dev.mozilla.jp/2016/05/a-taste-of-javascripts-new-parallel-primitives/">JavaScript の並列処理機能を味見してみる</a></p>
 </li>
</ul>