Atomics : méthode statique compareExchange()
Baseline
Widely available
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis décembre 2021.
La méthode statique compareExchange() de l'objet Atomics échange une valeur d'un tableau à un emplacement donné si la valeur qui était dans le tableau correspond à une valeur donnée. Cette méthode renvoie l'ancienne valeur à cet emplacement, qu'il y ait eu remplacement ou non. Cette opération atomique garantit qu'aucune autre opération d'écriture n'est appliquée tant que la valeur modifiée n'est pas écrite.
Exemple interactif
// Crée un SharedArrayBuffer avec une taille en octets
const buffer = new SharedArrayBuffer(16);
const uint8 = new Uint8Array(buffer);
uint8[0] = 5;
Atomics.compareExchange(uint8, 0, 5, 2); // Retourne 5
console.log(Atomics.load(uint8, 0));
// Résultat attendu : 2
Atomics.compareExchange(uint8, 0, 5, 4); // Retourne 2
console.log(Atomics.load(uint8, 0));
// Résultat attendu : 2
Syntaxe
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
Paramètres
typedArray-
Un tableau typé entier partagé parmi
Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,BigInt64ArrayouBigUint64Array. index-
La position dans le
typedArrayoù échanger unereplacementValue. expectedValue-
La valeur avec laquelle on teste l'égalité.
replacementValue-
Le nombre à échanger.
Valeur de retour
L'ancienne valeur à la position définie (typedArray[index]). Si la valeur retournée est égale à expectedValue, l'échange a réussi ; sinon, l'échange a échoué.
Exceptions
TypeError-
Levée si
typedArrayn'est pas un des types d'entiers autorisés. RangeError-
Levée si
indexest en dehors des limites detypedArray.
Exemples
>Utilisation de compareExchange()
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);
ta[0] = 7;
Atomics.compareExchange(ta, 0, 7, 12); // retourne 7, l'ancienne valeur
Atomics.load(ta, 0); // 12
Vérification de la valeur de retour
Compare-and-swap garantit que la nouvelle valeur est calculée à partir d'informations à jour ; si la valeur a été mise à jour par un autre processus entre-temps, l'écriture échouera. Par conséquent, vous devez vérifier la valeur de retour de compareExchange() pour savoir si l'opération a échoué, et réessayer si nécessaire.
Voici un exemple d'additionneur atomique (même fonctionnalité que Atomics.add()), adapté de l'article Wikipédia lié :
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;
}
Il lit d'abord la valeur à l'index donné, puis tente de la mettre à jour avec la nouvelle valeur. Il continue de réessayer jusqu'à ce qu'il réussisse à mettre à jour la valeur.
Spécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-atomics.compareexchange> |