Atomics - Guida rapida

Atomics

Atomics è un oggetto in JavaScript che fornisce operazioni atomiche da eseguire come metodi statici. Proprio come i metodi dell'oggetto Math, anche i metodi e le proprietà di Atomics sono statici. Gli atomici vengono utilizzati con gli oggetti SharedArrayBuffer.

Le operazioni Atomic sono installate su un Atomics Module. A differenza di altri oggetti globali, Atomics non è un costruttore. Atomics non può essere utilizzato con un nuovo operatore o può essere richiamato come funzione.

Operazioni atomiche

Le operazioni atomiche sono ininterrotte.

Quando la memoria è condivisa, più thread possono leggere o scrivere dati esistenti nella memoria. Quindi, se i dati vengono modificati, ci sarà una perdita di dati Le operazioni atomiche assicurano che i valori previsti (dati) siano scritti e letti accuratamente. Le operazioni atomiche non verranno avviate fino a quando e a meno che l'operazione corrente non sia terminata, quindi non è possibile modificare i dati esistenti.

Esempio

Di seguito è riportato il codice che dimostra l'uso di JavaScript Atomics Operation -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

Atomics

Atomics è un oggetto in JavaScript che fornisce operazioni atomiche da eseguire come metodi statici. Proprio come i metodi dell'oggetto Math, anche i metodi e le proprietà di Atomics sono statici. Gli atomici vengono utilizzati con gli oggetti SharedArrayBuffer.

Le operazioni Atomic sono installate su un Atomics Module. A differenza di altri oggetti globali, Atomics non è un costruttore. Atomics non può essere utilizzato con un nuovo operatore o può essere richiamato come funzione.

Operazioni atomiche

Le operazioni atomiche sono ininterrotte.

Quando la memoria è condivisa, più thread possono leggere o scrivere dati esistenti nella memoria. Quindi, se i dati vengono modificati, ci sarà una perdita di dati Le operazioni atomiche assicurano che i valori previsti (dati) siano scritti e letti accuratamente. Le operazioni atomiche non verranno avviate fino a quando e a meno che l'operazione corrente non sia terminata, quindi non è possibile modificare i dati esistenti.

Esempio

Di seguito è riportato il codice che dimostra l'uso di JavaScript Atomics Operation -

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

addmetodo aggiunge un valore fornito in una data posizione nell'array. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.add(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • value essere aggiunto.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

andIl metodo calcola l'AND bit per bit con un valore fornito in una data posizione nell'array. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.and(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • value con cui calcolare AND bit per bit.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.and(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 & 2 = 110 & 010 = 010 = 2
            container.innerHTML = Atomics.and(arr, 0, 2) + '<br/>'+ Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

compareExchangemetodo confronta e scambia un valore di sostituzione se il valore dato non è uguale al vecchio valore. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • expectedValue per verificare l'uguaglianza.

  • replacementValue scambiare.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.compareExchange(arr, 0, 6, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.compareExchange(arr, 0, 6, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

exchangemetodo scambia un dato valore in una data posizione di un array. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.exchange(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • value scambiare.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.exchange(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.exchange(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

isLockFreeviene utilizzato per determinare se i blocchi devono essere utilizzati o meno per le operazioni atomiche. Se la dimensione specificata è una delle proprietà TypedArray.BYTES_PER_ELEMENT dei tipi TypedArray interi, restituisce true. TypedArray.BYTES_PER_ELEMENT rappresenta la dimensione in byte di ogni elemento di un array tipizzato.

Sintassi

Atomics.isLockFree(size)

Parametri

  • size da archiviare in byte.

Ritorno

Restituisce true se l'operazione è priva di blocchi come false.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.isLockFree(1)</p>
      <p>Atomics.isLockFree(3)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            // Int8Array.BYTES_PER_ELEMENT = 1
            container.innerHTML = Atomics.isLockFree(Int8Array.BYTES_PER_ELEMENT) + '<br/>' + Atomics.isLockFree(3);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

load restituisce un valore in una data posizione nell'array.

Sintassi

Atomics.load(typedArray, index)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

Ritorno

Restituisce il valore in una determinata posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

notifyil metodo notifica all'agente in attesa di svegliarsi. Il metodo notify può funzionare solo con Int32Array creato utilizzando SharedArrayBuffer. Restituisce 0 in caso di utilizzo di un oggetto ArrayBuffer non condiviso.

Sintassi

Atomics.notify(typedArray, index, count)

Parametri

  • typedArray è un Int32Array condiviso.

  • index è la posizione nel typedarray su cui svegliarsi.

  • count è il numero di agenti inattivi da notificare.

Ritorno

Restituisce il numero di agenti svegliati.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.store(arr, 0, 5)</p>
      <p>Atomics.notify(arr, 0, 1)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(16);
            var arr = new Int32Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;            
            container.innerHTML = Atomics.store(arr, 0, 5) + '<br>' + Atomics.notify(arr, 0, 1);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

ormetodo calcola l'OR bit per bit con un valore fornito in una data posizione nella matrice. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.or(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • value con cui calcolare l'OR bit per bit.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.or(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 | 2 = 110 | 010 = 110 = 6
            container.innerHTML = Atomics.or(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

storememorizza un valore nella posizione fornita in un array e restituisce lo stesso. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.store(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray dove il valore deve essere memorizzato.

  • value da conservare.

Ritorno

Restituisce il valore memorizzato in una determinata posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.store(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;           
            container.innerHTML = Atomics.store(arr, 0, 2) + '<br/>'
            + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

submetodo sottrae un valore fornito in una data posizione nella matrice. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.sub(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • value da sottrarre.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.sub(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 - 2 = 4
            container.innerHTML = Atomics.sub(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.

xorIl metodo calcola lo XOR bit per bit con un valore fornito in una data posizione nell'array. Restituisce il vecchio valore in quella posizione. Questa operazione atomica garantisce che nessun'altra scrittura possa avvenire fino a quando il valore modificato non viene riscritto.

Sintassi

Atomics.xor(typedArray, index, value)

Parametri

  • typedArray è l'array intero digitato.

  • index è la posizione in typedarray.

  • value con cui calcolare XOR bit per bit.

Ritorno

Restituisce il vecchio valore in una data posizione.

Eccezioni

  • TypeError nel caso in cui l'array passato non sia un array di tipo intero.

  • RangeError se l'indice passato è fuori limite nell'array digitato.

Esempio

Di seguito è riportato il codice per l'implementazione di JavaScript Atomics:

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.xor(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // create a SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // Initialise element at zeroth position of array with 6
            arr[0] = 6;
            //6 xor 2 = 110 xor 010 = 100 = 4
            container.innerHTML = Atomics.xor(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

Produzione

Verifica il risultato.