L' oggetto Atomics
fornisce operazioni atomiche come metodi statici. Sono utilizzati con gli oggetti SharedArrayBuffer
.
Le operazioni atomiche sono implementate nel modulo Atomics
. Diversamente dagli altri oggetti global, Atomics
non è un constructor. Non è, quindi, possibile utilizzarlo con new
operator o invocare l'oggetto Atomics
come una funzione. Tutte le proprietà ed i metodi di Atomics
sono statici (come per esempio nel caso dell'oggetto Math
).
Propertà
Atomics[Symbol.toStringTag]
- Il valore di questa proprietà è "Atomics".
Metodi
Operazioni Atomiche
Quando la memoria è condivisa, molti thread possono leggere e scrivere gli stessi dati in memoria. Le operazioni atomiche fanno in modo che: siano scritti e letti valori predicibili, che ciscuna operazione termini prima che la successiva abbia inizio e che ciascuna operazione non sia interrotta.
Atomics.add()
- Aggiunge un determinato valore in una determinata posizione dell'array. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Atomics.and()
- Calcola un "bitwise AND" in una determinata posizione dell'array. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Atomics.compareExchange()
- Memorizza un dato valore in una posizione dell'array, se questo valore è uguale ad un altro determinato valore. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Atomics.exchange()
- Memorizza un dato valore in una determinata posizione nell'array. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Atomics.load()
- Restituisce il valore di una determinata posizione nell'array.
Atomics.or()
- Calcola un "bitwise OR" in una determinata posizione dell'array. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Atomics.store()
- Memorizza un dato valore in una determinata posizione dell'array. Restituisce lo stesso valore momorizzato.
Atomics.sub()
- Sottrae un determinato valore ad una data posizione dell'array. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Atomics.xor()
- Calcola un "bitwise XOR" in una determinata posizione dell'array. Restituisce il vecchio valore che occupava la medesima posizione nell'array.
Wait and wake
I metodi wait()
e wake()
sono modellati sul futexes ("fast user-space mutex") di Linux e forniscono metodi di attesa finchè una certa condizione non diventa vera e sono tipicamente utilizzati in costrutti bloccanti.
Atomics.wait()
-
Verifica che una certa posizione dell'array continui a contenere un determinato valore e si mette in attesa o va in time-out. Restituisce i valori
"ok"
,"not-equal"
, oppure"timed-out"
. Se l'attesa non è consentita dall'agente che effettua la chiamata, allora il metodo innesca una "Error Exception" (molti browsers non consentirannowait()
nel loro thread principale) Atomics.wake()
- "Sveglia" gli agenti dormienti nella coda di wait in una determinata posizione dell'array. Restituisce il numero degli agenti "svegliati".
Atomics.isLockFree(size)
-
Un primitiva di ottimizzazione che può essere utilizzata per determinare quando utilizzare "lock" o operazioni atomiche. Restituisce
true
, se un operazione atomica su un array di una data dimensione può essere implementata utilizzando operazioni atomiche hardware (invece del "lock"). Solo per esperti.
Specifiche
Specifiche | Status | Commenti |
---|---|---|
ECMAScript (ECMA-262) The definition of 'Atomics' in that specification. |
Living Standard | Definizione Iniziale in ES2017. |
ECMAScript 2017 (ECMA-262) The definition of 'Atomics' in that specification. |
Standard |
Compatibilità con i Browser
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | No support [2] | 55 (55) [1] | No support | No support | No support |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | No support | No support | 55.0 (55) [1] | No support | No support | No support |
[1] In Firefox, dalla versione 46 alla versione 54 questa feature è disabilitata da una configurazione avenzata. In about:config, configurare javascript.options.shared_memory
a true
.
[2] L' implementazione è in via di sviluppo e richiede i flag di runtime: --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer
Note di Compatibilità
Prima di SpiderMonkey 48 (Firefox 48 / Thunderbird 48 / SeaMonkey 2.45), i nomi e le semantiche delle API non erano ancora state implementate. Le modifiche tra la versione 46 e la versione 48 di Firefox, sono:
- I metodi
Atomics.futexWakeOrRequeue()
eAtomics.fence()
sono stati completamente rimossi (bug 1259544 e bug 1225028). - I metodi
Atomics.wait()
eAtomics.wake()
sono sati chiamatiAtomics.futexWait()
eAtomics.futexWake()
(bug 1260910). Nota: I vecchi nomi sono stati rimossi nella versione 49 e successive (bug 1262062). - Le proprietà
Atomics.OK
,Atomics.TIMEDOUT
,Atomics.NOTEQUAL
sono state rimosse. Il metodoAtomics.wait()
adesso restituisce le stringhe "ok", "timed-out" e "not-equal" (bug 1260835). -
Il parametro
count
del metodoAtomics.wake()
è stato cambiato: il valore di default adesso è+Infinity
, e non0
(bug 1253350).
Vedi anche
ArrayBuffer
- JavaScript typed arrays
- Web Workers
- parlib-simple – a simple library providing synchronization and work distribution abstractions.
- Shared Memory – a brief tutorial
- A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks