Spec-Zone.ru › JavaScript

Atomics.compareExchange()

Базовая функциональность Широко доступна

Эта возможность хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с декабря 2021 года.

Статический метод Atomics.compareExchange() обменивает заданное значение замещения в заданной позиции массива, если заданное ожидаемое значение равно старому значению. Он возвращает старое значение в этой позиции, независимо от того, было ли оно равно ожидаемому значению или нет. Эта атомарная операция гарантирует, что никакая другая запись не произойдет до тех пор, пока измененное значение не будет записано обратно.

Синтаксис

Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)

Параметры

typedArray
Типизированный массив целых чисел. Один из Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array, или BigUint64Array.
index
Позиция в typedArray, для которой нужно выполнить обмен replacementValue.
expectedValue
Значение, которое нужно проверить на равенство.
replacementValue
Число для обмена (замены).

Возвращаемое значение

Старое значение в заданной позиции (typedArray[index]). Если возвращаемое значение равно expectedValue, обмен был успешным; в противном случае обмен не удался.

Исключения

TypeError
Генерируется, если typedArray не является одним из разрешенных целочисленных типов.
RangeError
Генерируется, если index выходит за границы в typedArray.

Примеры

Обратите внимание, что эти примеры не могут быть запущены непосредственно из консоли или произвольной веб-страницы, поскольку SharedArrayBuffer не определен, если не соблюдены его требования безопасности.

Использование Atomics.compareExchange()

// Create a SharedArrayBuffer with a size in bytes
const sab = new SharedArrayBuffer(1024);
// Create a view and set the value of the 0 index
const ta = new Uint8Array(sab);
ta[0] = 7;

console.log(Atomics.compareExchange(ta, 0, 7, 12)); // 7, the old value
console.log(Atomics.load(ta, 0)); // 12, the new/current value

Проверка возвращаемого значения

Сравнение-с-обменом гарантирует, что новое значение вычисляется на основе актуальной информации; если значение было обновлено другим потоком за это время, запись завершится ошибкой. Следовательно, вам следует проверить возвращаемое значение compareExchange(), чтобы убедиться, что операция не завершилась ошибкой, и повторить попытку при необходимости.

Вот пример атомарного сумматора (та же функциональность, что и у Atomics.add()), адаптированный из связанной статьи в Википедии:

function add(mem, index, a) {
  let done = false;
  while (!done) {
    const value = Atomics.load(mem, index);
    done = Atomics.compareExchange(mem, index, value, value + a) === value;
  }
  return value + a;
}

Сначала он считывает значение по заданному индексу, а затем пытается обновить его новым значением. Он продолжает повторять попытки, пока успешно не обновит значение.

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-atomics.compareexchange

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
compareExchange
68
79
78
55
15.2
89
79
63
15.2
15.0
89
15.2
1.0.0
1.0
8.10.0

Смотрите также

  • Atomics
  • Atomics.exchange()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/compareExchange

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API