Cette fonction est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.
L'objet Atomics
fournit des opérations atomiques sous la forme de méthodes statiques. Celles-ci sont utilisées avec les objets SharedArrayBuffer
.
Les opérations atomiques sont installées sur un module Atomics
. À la différence des autres objets globaux, Atomics
n'est pas un constructeur. Pour cette raison, il ne peut être utilisé avec l'opérateur Opérateurs/L_opérateur_new
et il ne peut pas être appelé comme une fonction. Les propriétés et les méthodes d'Atomics
sont statiques (Atomics
fonctionne ainsi comme l'objet Math
).
Méthodes
Opérations atomiques
Lorsque la mémoire est partagée, plusieurs threads peuvent lire et écrire sur les mêmes données en mémoire. Les opérations atomiques permettent de s'assurer que des valeurs prévisibles sont écrites et lues, que les opérations sont finies avant que la prochaine débute et que les opérations ne sont pas interrompues.
Atomics.add()
- Cette méthode ajoute une valeur donnée à une position donnée dans le tableau. Elle renvoie l'ancienne valeur qui était à cette position.
Atomics.and()
- Cette méthode calcule un ET binaire sur une position donnée dans le tableau. Elle renvoie l'ancienne valeur qui était à cette position.
Atomics.compareExchange()
- Cette méthode stocke une valeur donnée à une position donnée dans le tableau si elle est égale à une valeur donnée. Elle renvoie l'ancienne valeur.
Atomics.exchange()
- Cette méthode stocke une valeur donnée à une position donnée dans le tableau. Elle renvoie l'ancienne valeur.
Atomics.load()
- Cette méthode renvoie la valeur à une position donnée dans le tableau.
Atomics.or()
- Cette méthode calcule un OU binaire sur une position donnée dans le tableau. Elle renvoie l'ancienne valeur qui était à cette position.
Atomics.store()
- Cette méthode stocke une valeur donnée à une position donnée dans le tableau. Elle renvoie l'ancienne valeur.
Atomics.sub()
- Cette méthode soustrait une valeur donnée à une position donnée du tableau. Elle renvoie l'ancienne valeur qui était contenue à cette position.
Atomics.xor()
- Cette méthode calcule un OU exclusif binaire sur une position donnée dans le tableau. Elle renvoie l'ancienne valeur qui était à cette position.
Attente et réveil (wait
et wake
)
Le méthodes wait
() et wake()
sont basées sur les futex Linux (selon le vocabulaire employé sur Linux où ça signifie « fast user-space mutex » ou encore « mutex rapide pour l'espace utilisateur ») fournissent des outils pour attendre jusqu'à ce qu'une condition donnée soit vérifiée. Généralement ces méthodes sont utilisées pour bloquer des opérations.
Atomics.wait()
- Cette méthode vérifie qu'une position donnée du tableau contient bien une valeur donnée puis dort ou expire. Elle renvoie une des chaînes suivantes
"ok"
,"not-equal"
,"timed-out"
. Si l'agent appelant ne permet pas d'attente, cela lèvera une exceptionError
(la plupart des navigateurs ne permettront pas quefutexWait()
soit utilisé sur le thread principal du navigateur). Atomics.futexWake()
- Cette méthode réveille des agents qui dorment dans la file d'attente à une position donnée. Elle renvoie le nombre d'agents réveillés.
Atomics.isLockFree()
- Une primitive d'optimisation qui peut être utilisée afin de déterminer s'il faut utiliser des verrous (locks) ou des opérations atomiques. Elle renvoie
true
si la taille donnée est l'une des propriétésBYTES_PER_ELEMENT
des typesTypedArray
et qu'on peut donc implémenter l'opération de façon atomique plutôt que d'utiliser un verrou.
Spécifications
Spécification | État | Commentaires |
---|---|---|
ECMAScript Shared Memory and Atomics La définition de 'Atomics' dans cette spécification. |
Projet | Définition initiale. |
Compatibilité des navigateurs
Fonctionnalité | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Support simple | Pas de support [2] | Pas de support | 46 (46) [1] [3] | Pas de support | Pas de support | Pas de support |
Fonctionnalité | Android | Chrome pour Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Support simple | Pas de support | Pas de support | 46.0 (46) [1] [3] | Pas de support | Pas de support | Pas de support |
[1] Cette fonctionnalité est désactivée grâce à une préférence. Sous about:config
, il faut activer javascript.options.shared_memory
avec true
.
[2] L'implémentation est en cours de développement et ces marqueurs d'exécution doivent être utilisés : --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer
Notes de compatibilité
[3] La spécification sur les objets, méthodes, propriétés liées à la mémoire partagée est toujours en cours de stabilisation. Avant SpiderMonkey 48 (Firefox 48 / Thunderbird 48 / SeaMonkey 2.45), les noms les plus récents et la sémantique la plus récente n'étaient pas encore implémentés. Les changements qui ont eu lieu entre la version 46 et la version 48 de Firefox sont :
- Les méthodes
Atomics.futexWakeOrRequeue()
etAtomics.fence()
sont désormais complètement retirées (cf. bug 1259544 et bug 1225028). - Les méthodes
Atomics.wait()
etAtomics.wake()
qui étaient nomméesAtomics.futexWait()
eteAtomics.futexWake()
(cf. bug 1260910). Les anciens noms seront définitivement supprimés à partir de la version 49 (bug 1262062). - Les propriétés
Atomics.OK
,Atomics.TIMEDOUT
,Atomics.NOTEQUAL
ont été retirées. La méthodeAtomics.wait()
renvoie désormais les chaînes de caractères"ok"
,"timed-out"
ou"not-equal"
(cf. bug 1260835). -
Le paramètre
count
de la méthodeAtomics.wake()
a été modifié, sa valeur par défaut est désormais+Infinity
et non0
(bug 1253350).
Voir aussi
ArrayBuffer
- Les tableaux typés en JavaScript
- Web Workers
- parlib-simple – un bibliothèque simple qui fournit des abstractions pour synchronisers et distribuer des tâches.
- La mémoire partagée – un rapide tutoriel
- A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks (en anglais)