Atomics
Atomics предоставляет атомарные операции как статические методы. Используется вместе с объектом SharedArrayBuffer. Атомарные операции установлены в модуле Atomics. В отличие от других глобальных объектов, Atomics не является конструктором. Его нельзя использовать вместе с оператором new или вызывать объект Atomics как функцию. Все свойства и методы Atomics статические (как у объекта Math, к примеру).
Свойства
Atomics[Symbol.toStringTag]- Значение этого свойства - "Atomics".
Методы
Атомарные операции
Когда память разделена, несколько потоков могут читать и записывать одни и те же данные в память. Атомарные операции гарантируют, что ожидаемые значения будут записаны и прочитаны, а операции завершены, прежде чем следующая операция начнёт свою работу, и они не будут прерваны.
Atomics.add()- Добавляет представленное значение к текущему по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.
Atomics.and()(en-US)- Вычисляет побитовое AND в указанной позиции массива. Возвращает предыдущее значение в этой позиции.
Atomics.compareExchange()(en-US)- Сохраняет представленное значение в указанную позицию массива, если оно эквивалентно представленному значению. Возвращает предыдущее значение.
Atomics.exchange()(en-US)- Сохраняет представленное значение в указанную позицию массива. Возвращает предыдущее значение.
Atomics.load()(en-US)- Возвращает значение из указанной позиции массива.
Atomics.or()(en-US)- Вычисляет побитовое OR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.
Atomics.store()(en-US)- Сохраняет представленное значение в указанную позицию массива. Возвращает значение.
Atomics.sub()- Вычитает представленное значение из текущего по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.
Atomics.xor()(en-US)- Вычисляет побитовое XOR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.
Wait и notify
wait() и wake() методы моделируются на основе futexes ("fast user-space mutex" - быстрый мьютекс пользовательского пространства) Linux и предоставляют собой способы ожидания момента, когда определённое состояние не станет true, и обычно используется как блокирующие конструкции.
Atomics.wait()(en-US)-
Проверяет, содержится в указанной позиции массива все ещё представленное значение и спит в ожидании или тайм-аут. Возвращает
"ok","not-equal"или"timed-out". Если ожидание не разрешено в вызывающем агенте, тогда выбросит ошибку исключения (большинство браузеров не разрешаютwait()в главном потоке браузера). Atomics.wake()(en-US)- Пробуждает некоторых агентов, которые спят в очереди ожидания в указанной позиции массива. Возвращает количество агентов, которые были разбужены.
Atomics.isLockFree(size)(en-US)-
Оптимизационный примитив, который может быть использован для определения использовать ли блокирующие операции или атомарные. Возвращает
true, если атомарные операции над массивами с указанным размерами элементов будут выполнены с использованием аппаратных атомарных операций (как противоположность блокирующим). Только для специалистов.
Спецификации
| Specification | Status | Comment |
|---|---|---|
| ECMAScript (ECMA-262) Определение 'Atomics' в этой спецификации. |
Живой стандарт | Initial definition in ES2017. |
| ECMAScript 2017 (ECMA-262) Определение 'Atomics' в этой спецификации. |
Стандарт |
Поддержка браузерами
BCD tables only load in the browser
Похожие заметки
До SpiderMonkey 48 (Firefox 48 / Thunderbird 48 / SeaMonkey 2.45), финальные имена API и семантика не были ещё реализованы. Изменения между Firefox v. 46 и v. 48:
- Методы
Atomics.futexWakeOrRequeue()иAtomics.fence()полностью удалены (баг 1259544 и баг 1225028). - Методы
Atomics.wait()(en-US) иAtomics.wake()(en-US) были названыAtomics.futexWait()иAtomics.futexWake()(баг 1260910). Примечание: старые имена были удалены в версии 49 и младше (баг 1262062). - Свойства
Atomics.OK,Atomics.TIMEDOUT,Atomics.NOTEQUALбыли удалены.Atomics.wait()(en-US) метод теперь возвращает строки "ok", "timed-out" и "not-equal" (баг 1260835). -
Параметр
countметодаAtomics.wake()(en-US) изменился: теперь он по умолчанию равен+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