Questa traduzione è incompleta. Collabora alla traduzione di questo articolo dall’originale in lingua inglese.
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 Latest Draft (ECMA-262) The definition of 'Atomics' in that specification. |
Draft | 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.NOTEQUALsono state rimosse. Il metodoAtomics.wait()adesso restituisce le stringhe "ok", "timed-out" e "not-equal" (bug 1260835). -
Il parametro
countdel 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