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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
---
title: Atomics
slug: Web/JavaScript/Reference/Global_Objects/Atomics
translation_of: Web/JavaScript/Reference/Global_Objects/Atomics
---
<div>{{JSRef}}</div>
<div>Объект <strong><code>Atomics</code></strong> предоставляет атомарные операции как статические методы. Используется вместе с объектом {{jsxref("SharedArrayBuffer")}}. </div>
<div> </div>
<p>Атомарные операции установлены в модуле <code>Atomics</code>. В отличие от других глобальных объектов, <code>Atomics</code> не является конструктором. Его нельзя использовать вместе с оператором <a href="/en-US/docs/Web/JavaScript/Reference/Operators/new"><code>new</code></a> или вызывать объект <code>Atomics</code> как функцию. Все свойства и методы <code>Atomics</code> статические (как у объекта {{jsxref("Math")}}, к примеру).</p>
<h2 id="Свойства">Свойства</h2>
<dl>
<dt><code>Atomics[Symbol.toStringTag]</code></dt>
<dd>Значение этого свойства - "Atomics".</dd>
</dl>
<h2 id="Методы">Методы</h2>
<h3 id="Атомарные_операции">Атомарные операции</h3>
<p>Когда память разделена, несколько потоков могут читать и записывать одни и те же данные в память. Атомарные операции гарантируют, что ожидаемые значения будут записаны и прочитаны, а операции завершены, прежде чем следующая операция начнет свою работу, и они не будут прерваны.</p>
<dl>
<dt>{{jsxref("Atomics.add()")}}</dt>
<dd>Добавляет представленное значение к текущему по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.</dd>
<dt>{{jsxref("Atomics.and()")}}</dt>
<dd>Вычисляет побитовое AND в указанной позиции массива. Возвращает предыдущее значение в этой позиции.</dd>
<dt>{{jsxref("Atomics.compareExchange()")}}</dt>
<dd>Сохраняет представленное значение в указанную позицию массива, если оно эквивалентно представленному значению. Возвращает предыдущее значение.</dd>
<dt>{{jsxref("Atomics.exchange()")}}</dt>
<dd>Сохраняет представленное значение в указанную позицию массива. Возвращает предыдущее значение.</dd>
</dl>
<dl>
<dt>{{jsxref("Atomics.load()")}}</dt>
<dd>Возвращает значение из указаной позиции массива.</dd>
<dt>{{jsxref("Atomics.or()")}}</dt>
<dd>Вычисляет побитовое OR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.</dd>
<dt>{{jsxref("Atomics.store()")}}</dt>
<dd>Сохраняет представленное значение в указанную позицию массива. Возвращает значение.</dd>
<dt>{{jsxref("Atomics.sub()")}}</dt>
<dd>Вычитает представленное значение из текущего по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.</dd>
<dt>{{jsxref("Atomics.xor()")}}</dt>
<dd>Вычисляет побитовое XOR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.</dd>
</dl>
<h3 id="Wait_и_notify">Wait и notify</h3>
<p><code>wait()</code> и <code>wake()</code> методы моделируются на основе futexes ("fast user-space mutex" - быстрый мьютекс пользовательского пространства) Linux и предоставляют собой способы ожидания момента, когда определенное состояние не станет true, и обычно используется как блокирующие конструкции.</p>
<dl>
<dt>{{jsxref("Atomics.wait()")}}</dt>
<dd>
<p>Проверяет, содержится в указанной позиции массива все еще представленное значение и спит в ожидании или тайм-аут. Возвращает <code>"ok"</code>, <code>"not-equal" </code>или <code>"timed-out"</code>. Если ожидание не разрешено в вызывающем агенете, тогда выбросит ошибку исключения (большинство браузеров не разрешают <code>wait()</code> в главном потоке барузера).</p>
</dd>
<dt>{{jsxref("Atomics.wake()")}}</dt>
<dd>Пробуждает некоторых агентов, которые спят в очереди ожидания в указанной позиции массива. Возвращает количество агентов, которые были разбужены.</dd>
<dt>{{jsxref("Atomics.isLockFree()", "Atomics.isLockFree(size)")}}</dt>
<dd>
<p>Оптимизационный примитив, который может быть использован для определения использовать ли блокирующие операции или атомарные. Возвращает <code>true</code>, если атомарные операции над массивaми с указанным размерами элеменатов будут выполнены с использованием аппаратных атомарных опреаций (как противоположность блокирующим). Только для специалистов.</p>
</dd>
</dl>
<h2 id="Спецификации">Спецификации</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specification</th>
<th scope="col">Status</th>
<th scope="col">Comment</th>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-atomics-object', 'Atomics')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td>Initial definition in ES2017.</td>
</tr>
<tr>
<td>{{SpecName('ES8', '#sec-atomics-object', 'Atomics')}}</td>
<td>{{Spec2('ES8')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Поддержка_браузерами">Поддержка браузерами</h2>
<p>{{CompatibilityTable}}</p>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Basic support</td>
<td>{{CompatNo}} [2]</td>
<td>{{CompatGeckoDesktop("55")}} [1]</td>
<td>{{CompatNo}}</td>
<td>{{CompatNo}}</td>
<td>{{CompatNo}}</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Android</th>
<th>Chrome for Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Basic support</td>
<td>{{CompatNo}}</td>
<td>{{CompatNo}}</td>
<td>{{CompatGeckoMobile("55")}} [1]</td>
<td>{{CompatNo}}</td>
<td>{{CompatNo}}</td>
<td>{{CompatNo}}</td>
</tr>
</tbody>
</table>
</div>
<p>[1] In Firefox version 46 until version 54, this feature is disabled by a preference setting. In about:config, set <code>javascript.options.shared_memory</code> to <code>true</code>. </p>
<p>[2] The implementation is under development and needs these runtime flags: <code>--js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer</code></p>
<h2 id="Похожие_заметки">Похожие заметки</h2>
<p>До SpiderMonkey 48 {{geckoRelease(48)}}, финальные имена API и сематика не были еще реализованы. Изменения между Firefox v. 46 и v. 48:</p>
<ul>
<li>Методы <code>Atomics.futexWakeOrRequeue()</code> и <code>Atomics.fence()</code> полностью удалены ({{bug(1259544)}} и {{bug(1225028)}}).</li>
<li>Методы {{jsxref("Atomics.wait()")}} и {{jsxref("Atomics.wake()")}} были назвны <code>Atomics.futexWait()</code> и <code>Atomics.futexWake()</code> ({{bug(1260910)}}). Заметка: старые имена были удалены в версии 49 и младше ({{bug(1262062)}}).</li>
<li>Свойства <code>Atomics.OK</code>, <code>Atomics.TIMEDOUT</code>, <code>Atomics.NOTEQUAL</code> были удалены. {{jsxref("Atomics.wait()")}} метод теперь возвращает строки "ok", "timed-out" и "not-equal" ({{bug(1260835)}}).</li>
<li>
<p>Параметр <code>count</code> метода {{jsxref("Atomics.wake()")}} изменился: теперь он по умолчанию равен <code>+Infinity</code>, а не <code>0</code> ({{bug(1253350)}}).</p>
</li>
</ul>
<h2 id="Смотри_также">Смотри также</h2>
<ul>
<li>{{jsxref("ArrayBuffer")}}</li>
<li><a href="/en-US/docs/Web/JavaScript/Typed_arrays">JavaScript typed arrays</a></li>
<li><a href="/en-US/docs/Web/API/Web_Workers_API">Web Workers</a></li>
<li><a href="https://github.com/lars-t-hansen/parlib-simple">parlib-simple </a>– a simple library providing synchronization and work distribution abstractions.</li>
<li><a href="https://github.com/tc39/ecmascript_sharedmem/blob/master/TUTORIAL.md">Shared Memory – a brief tutorial</a></li>
<li><a href="https://hacks.mozilla.org/2016/05/a-taste-of-javascripts-new-parallel-primitives/">A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks</a></li>
</ul>
|