Atomics
Atomics
предоставляет атомарные операции как статические методы. Используется вместе с объектом SharedArrayBuffer
. Атомарные операции установлены в модуле Atomics
. В отличие от других глобальных объектов, Atomics
не является конструктором. Его нельзя использовать вместе с оператором new
или вызывать объект Atomics
как функцию. Все свойства и методы Atomics
статические (как у объекта Math
, к примеру).
Свойства
Atomics[Symbol.toStringTag]
- Значение этого свойства - "Atomics".
Методы
Атомарные операции
Когда память разделена, несколько потоков могут читать и записывать одни и те же данные в память. Атомарные операции гарантируют, что ожидаемые значения будут записаны и прочитаны, а операции завершены, прежде чем следующая операция начнет свою работу, и они не будут прерваны.
Atomics.add()
- Добавляет представленное значение к текущему по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.
Atomics.and()
- Вычисляет побитовое AND в указанной позиции массива. Возвращает предыдущее значение в этой позиции.
Atomics.compareExchange()
- Сохраняет представленное значение в указанную позицию массива, если оно эквивалентно представленному значению. Возвращает предыдущее значение.
Atomics.exchange()
- Сохраняет представленное значение в указанную позицию массива. Возвращает предыдущее значение.
Atomics.load()
- Возвращает значение из указаной позиции массива.
Atomics.or()
- Вычисляет побитовое OR в указанной позиции массивая. Возвращает предыдущее значение в этой позиции.
Atomics.store()
- Сохраняет представленное значение в указанную позицию массива. Возвращает значение.
Atomics.sub()
- Вычитает представленное значение из текущего по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.
Atomics.xor()
- Вычисляет побитовое XOR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.
Wait и notify
wait()
и wake()
методы моделируются на основе futexes ("fast user-space mutex" - быстрый мьютекс пользовательского пространства) Linux и предоставляют собой способы ожидания момента, когда определенное состояние не станет true, и обычно используется как блокирующие конструкции.
Atomics.wait()
-
Проверяет, содержится в указанной позиции массива все еще представленное значение и спит в ожидании или тайм-аут. Возвращает
"ok"
,"not-equal"
или"timed-out"
. Если ожидание не разрешено в вызывающем агенете, тогда выбросит ошибку исключения (большинство браузеров не разрешаютwait()
в главном потоке барузера). Atomics.wake()
- Пробуждает некоторых агентов, которые спят в очереди ожидания в указанной позиции массива. Возвращает количество агентов, которые были разбужены.
Atomics.isLockFree(size)
-
Оптимизационный примитив, который может быть использован для определения использовать ли блокирующие операции или атомарные. Возвращает
true
, если атомарные операции над массивaми с указанным размерами элеменатов будут выполнены с использованием аппаратных атомарных опреаций (как противоположность блокирующим). Только для специалистов.
Спецификации
Specification | Status | Comment |
---|---|---|
ECMAScript (ECMA-262) Определение 'Atomics' в этой спецификации. |
Живой стандарт | Initial definition in ES2017. |
ECMAScript 2017 (ECMA-262) Определение 'Atomics' в этой спецификации. |
Стандарт |
Поддержка браузерами
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | Нет [2] | 55 (55) [1] | Нет | Нет | Нет |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | Нет | Нет | 55.0 (55) [1] | Нет | Нет | Нет |
[1] In Firefox version 46 until version 54, this feature is disabled by a preference setting. In about:config, set javascript.options.shared_memory
to true
.
[2] The implementation is under development and needs these runtime flags: --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer
Похожие заметки
До SpiderMonkey 48 (Firefox 48 / Thunderbird 48 / SeaMonkey 2.45), финальные имена API и сематика не были еще реализованы. Изменения между Firefox v. 46 и v. 48:
- Методы
Atomics.futexWakeOrRequeue()
иAtomics.fence()
полностью удалены (баг 1259544 и баг 1225028). - Методы
Atomics.wait()
иAtomics.wake()
были назвныAtomics.futexWait()
иAtomics.futexWake()
(баг 1260910). Заметка: старые имена были удалены в версии 49 и младше (баг 1262062). - Свойства
Atomics.OK
,Atomics.TIMEDOUT
,Atomics.NOTEQUAL
были удалены.Atomics.wait()
метод теперь возвращает строки "ok", "timed-out" и "not-equal" (баг 1260835). -
Параметр
count
методаAtomics.wake()
изменился: теперь он по умолчанию равен+Infinity
, а не0
(баг 1253350).
Смотри также
ArrayBuffer
- JavaScript typed arrays
- Web Workers
- parlib-simple – a simple library providing synchronization and work distribution abstractions.
- Shared Memory – a brief tutorial
- A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks