Atomics
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
Объект 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
, если атомарные операции над массивами с указанным размерами элементов будут выполнены с использованием аппаратных атомарных операций (как противоположность блокирующим). Только для специалистов.
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-atomics-object |
Совместимость с браузерами
BCD tables only load in the browser
Похожие заметки
До SpiderMonkey 48, финальные имена API и семантика не были ещё реализованы. Изменения между Firefox v. 46 и v. 48:
- Методы
Atomics.futexWakeOrRequeue()
иAtomics.fence()
полностью удалены (Firefox bug 1259544 и Firefox bug 1225028). - Методы
Atomics.wait()
иAtomics.wake()
были названыAtomics.futexWait()
иAtomics.futexWake()
(Firefox bug 1260910). Примечание: старые имена были удалены в версии 49 и младше (Firefox bug 1262062). - Свойства
Atomics.OK
,Atomics.TIMEDOUT
,Atomics.NOTEQUAL
были удалены.Atomics.wait()
метод теперь возвращает строки "ok", "timed-out" и "not-equal" (Firefox bug 1260835). - Параметр
count
методаAtomics.wake()
изменился: теперь он по умолчанию равен+Infinity
, а не0
(Firefox bug 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