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;
}
Сначала он считывает значение по заданному индексу, а затем пытается обновить его новым значением. Он продолжает повторять попытки, пока успешно не обновит значение.
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
Смотрите также
© 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