aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/atomics/index.html
blob: 88dbefc0361218b36cc0e7f550e67e0472b1db7e (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
---
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>, если атомарные операции над массивами с указанным размерами элементов будут выполнены с использованием аппаратных атомарных операций (как противоположность блокирующим). Только для специалистов.</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>{{Compat}}</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>