Atomics : méthode statique wait()
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 wait() de l'objet Atomics vérifie qu'un emplacement de mémoire partagée contient une valeur donnée et, si c'est le cas, se met en sommeil en attendant une notification de réveil ou l'expiration d'un délai. Elle retourne une chaîne de caractères valant "not-equal" si l'emplacement mémoire ne correspond pas à la valeur donnée, "ok" si elle est réveillée par Atomics.notify(), ou "timed-out" si le délai expire.
Atomics.wait() et Atomics.notify() sont utilisés ensemble pour permettre la synchronisation des processus basée sur une valeur en mémoire partagée. Un processus peut continuer immédiatement si la valeur de synchronisation a changé, ou attendre la notification d'un autre processus lorsqu'il atteint le point de synchronisation.
Cette méthode ne fonctionne qu'avec un Int32Array ou un BigInt64Array qui observe un SharedArrayBuffer. Elle est bloquante et ne peut pas être utilisée dans le thread principal. Pour une version non bloquante et asynchrone de cette méthode, voir Atomics.waitAsync().
Syntaxe
Atomics.wait(typedArray, index, value)
Atomics.wait(typedArray, index, value, timeout)
Paramètres
typedArray-
Un tableau typé partagé de type
Int32Array. index-
La position du tableau typé
typedArraysur laquelle on attend un changement. value-
La valeur attendue qu'on souhaite tester.
timeoutFacultatif-
Le temps à attendre pour le changement de valeur, exprimé en millisecondes. La valeur par défaut est
Infinity.
Valeur de retour
Une chaîne de caractères qui vaut "ok", "not-equal" ou "timed-out" selon le cas.
"not-equal"est retournée immédiatement si lavalueinitiale n'est pas égale à la valeur stockée àindex."ok"est retournée si elle est réveillée par un appel àAtomics.notify(), indépendamment du fait que la valeur attendue ait changé ou non."timed-out"est retournée si une attente en sommeil dépasse letimeoutspécifié sans être réveillée parAtomics.notify().
Exceptions
TypeError-
Levée dans l'un des cas suivants :
- Si
typedArrayn'est pas unInt32Arrayou unBigInt64Arrayqui observe unSharedArrayBuffer. - Si le processus courant ne peut pas être bloqué (par exemple, parce qu'il s'agit du processus principal).
- Si
RangeError-
Levée si
indexest hors des limites detypedArray.
Exemples
>Utilisation de wait()
Étant donné un Int32Array partagé :
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
Un processus de lecture est en sommeil et attend l'emplacement 0 parce que la value fournie correspond à ce qui est stocké à un index donné.
Le processus de lecture ne reprend pas l'exécution tant que le processus d'écriture n'a pas appelé Atomics.notify() sur la position 0 du typedArray fourni.
Remarquez que si, après le réveil, la valeur de l'emplacement 0 n'a pas été modifiée par le processus d'écriture, le processus de lecture ne se remettra pas en sommeil, mais continuera son exécution.
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
Un processus d'écriture stocke une nouvelle valeur et notifie le processus en attente une fois l'écriture effectuée :
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
Spécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-atomics.wait> |
Compatibilité des navigateurs
Voir aussi
- L'objet
Atomics - La méthode
Atomics.waitAsync() - La méthode
Atomics.notify()