Atomics - szybki przewodnik
Atomics
Atomics to obiekt w JavaScript, który udostępnia operacje atomowe do wykonania jako metody statyczne. Podobnie jak metody obiektu Math, metody i właściwości Atomics są również statyczne. Atomics są używane z obiektami SharedArrayBuffer.
Operacje Atomic są instalowane w module Atomics. W przeciwieństwie do innych obiektów globalnych Atomics nie jest konstruktorem. Atomics nie może być używany z operatorem new lub może być wywoływany jako funkcja.
Operacje atomowe
Operacje atomowe są nieprzerywalne.
Gdy pamięć jest współdzielona, wiele wątków może odczytywać lub zapisywać istniejące dane w pamięci. Więc jeśli jakiekolwiek dane ulegną zmianie, nastąpi utrata danych. Operacje atomowe upewnij się, że przewidywane wartości (dane) są poprawnie zapisywane i odczytywane. Operacje atomowe nie rozpoczną się, dopóki bieżąca operacja nie zostanie zakończona, więc nie ma możliwości zmiany istniejących danych.
Przykład
Poniżej znajduje się kod demonstrujący użycie 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>
Wynik
Sprawdź wynik.
Atomics
Atomics to obiekt w JavaScript, który udostępnia operacje atomowe do wykonania jako metody statyczne. Podobnie jak metody obiektu Math, metody i właściwości Atomics są również statyczne. Atomics są używane z obiektami SharedArrayBuffer.
Operacje Atomic są instalowane w module Atomics. W przeciwieństwie do innych obiektów globalnych Atomics nie jest konstruktorem. Atomics nie może być używany z operatorem new lub może być wywoływany jako funkcja.
Operacje atomowe
Operacje atomowe są nieprzerywalne.
Gdy pamięć jest współdzielona, wiele wątków może odczytywać lub zapisywać istniejące dane w pamięci. Więc jeśli jakiekolwiek dane ulegną zmianie, nastąpi utrata danych. Operacje atomowe upewnij się, że przewidywane wartości (dane) są poprawnie zapisywane i odczytywane. Operacje atomowe nie rozpoczną się, dopóki bieżąca operacja nie zostanie zakończona, więc nie ma możliwości zmiany istniejących danych.
Przykład
Poniżej znajduje się kod demonstrujący użycie 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>
Wynik
Sprawdź wynik.
addmetoda dodaje podaną wartość w podanej pozycji w tablicy. Zwraca starą wartość w tej pozycji. Ta niepodzielna operacja zapewnia, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.add(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
value do dodania.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
andoblicza bitowe AND z podaną wartością w danej pozycji w tablicy. Zwraca starą wartość na tej pozycji. Ta niepodzielna operacja zapewnia, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.and(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
value z którym ma zostać obliczony bitowy AND.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
compareExchangemetoda porównuje i zamienia wartość zastępczą, jeśli podana wartość nie jest taka sama jak stara wartość. Zwraca starą wartość na tej pozycji. Ta niepodzielna operacja zapewnia, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
expectedValue sprawdzić równość.
replacementValue na wymianę.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
exchangemetoda zamienia daną wartość na danej pozycji tablicy. Zwraca starą wartość w tej pozycji. Ta niepodzielna operacja gwarantuje, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.exchange(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
value na wymianę.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
isLockFreesłuży do określenia, czy blokady mają być używane, czy nie dla operacji atomowych. Jeśli podany rozmiar jest jedną z właściwości TypedArray.BYTES_PER_ELEMENT liczb całkowitych typów TypedArray, zwraca wartość true. TypedArray.BYTES_PER_ELEMENT reprezentuje rozmiar w bajtach każdego elementu tablicy o typie strukturalnym.
Składnia
Atomics.isLockFree(size)
Parametry
size do wpisania w bajtach.
Powrót
Zwraca wartość true, jeśli operacja jest wolna od blokad jako fałsz.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
load metoda zwraca wartość na podanej pozycji w tablicy.
Składnia
Atomics.load(typedArray, index)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
Powrót
Zwraca wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
notifymetoda powiadamia oczekującego agenta, aby się obudził. Powiadomienie może działać tylko z Int32Array utworzonym przy użyciu SharedArrayBuffer. Zwraca 0 w przypadku użycia niewspółdzielonego obiektu ArrayBuffer.
Składnia
Atomics.notify(typedArray, index, count)
Parametry
typedArray jest współużytkowanym Int32Array.
index jest pozycją w typedarray, na której należy się obudzić.
count to liczba uśpionych środków do powiadomienia.
Powrót
Zwraca liczbę obudzonych agentów.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
oroblicza bitowe OR z podaną wartością w danej pozycji w tablicy. Zwraca starą wartość na tej pozycji. Ta niepodzielna operacja gwarantuje, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.or(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
value z którym bitowym OR do obliczenia.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
storemetoda przechowuje wartość w podanej lokalizacji w tablicy i zwraca tę samą. Ta niepodzielna operacja gwarantuje, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.store(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray, w której ma być przechowywana wartość.
value być przechowywanym.
Powrót
Zwraca wartość przechowywaną na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
submetoda odejmuje podaną wartość w danej pozycji w tablicy. Zwraca starą wartość w tej pozycji. Ta niepodzielna operacja zapewnia, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.sub(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
value do odjęcia.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.
xoroblicza bitowy XOR z podaną wartością w danej pozycji w tablicy. Zwraca starą wartość na tej pozycji. Ta niepodzielna operacja zapewnia, że żaden inny zapis nie zostanie wykonany, dopóki zmodyfikowana wartość nie zostanie z powrotem zapisana.
Składnia
Atomics.xor(typedArray, index, value)
Parametry
typedArray jest tablicą wpisaną jako liczbę całkowitą.
index to pozycja w typedarray.
value z którym obliczany bitowy XOR.
Powrót
Zwraca starą wartość na podanej pozycji.
Wyjątki
TypeError w przypadku, gdy przekazana tablica nie jest tablicą o typie liczby całkowitej.
RangeError jeśli przekazany indeks jest poza ograniczeniem we wpisanej tablicy.
Przykład
Poniżej znajduje się kod do implementacji 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>
Wynik
Sprawdź wynik.