Atomics.wait()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
Die statische Methode Atomics.wait()
überprüft, ob eine Position im gemeinsam genutzten Speicher einen bestimmten Wert enthält und schläft, falls dies zutrifft, um auf eine Weckbenachrichtigung oder ein Timeout zu warten. Sie gibt einen String zurück, der "not-equal"
ist, wenn die Speicherstelle nicht mit dem angegebenen Wert übereinstimmt, "ok"
, wenn sie durch Atomics.notify()
geweckt wird, oder "timed-out"
, wenn das Timeout abläuft.
Atomics.wait()
und Atomics.notify()
werden zusammen verwendet, um die Thread-Synchronisation basierend auf einem Wert im gemeinsam genutzten Speicher zu ermöglichen. Ein Thread kann sofort fortfahren, wenn sich der Synchronisationswert geändert hat, oder er kann auf eine Benachrichtigung eines anderen Threads warten, wenn er den Synchronisationspunkt erreicht.
Diese Methode funktioniert nur mit einem Int32Array
oder BigInt64Array
, das einen SharedArrayBuffer
betrachtet. Sie ist blockierend und kann nicht im Hauptthread verwendet werden. Für eine nicht blockierende, asynchrone Version dieser Methode siehe Atomics.waitAsync()
.
Syntax
Atomics.wait(typedArray, index, value)
Atomics.wait(typedArray, index, value, timeout)
Parameter
typedArray
-
Ein
Int32Array
oderBigInt64Array
, das einenSharedArrayBuffer
betrachtet. index
-
Die Position im
typedArray
, auf die gewartet wird. value
-
Der erwartete Wert, der überprüft werden soll.
timeout
Optional-
Die Wartezeit in Millisekunden.
NaN
(und Werte, die inNaN
umgewandelt werden, wie z.B.undefined
) wird zuInfinity
. Negative Werte werden zu0
.
Rückgabewert
Ein String, der entweder "not-equal"
, "ok"
oder "timed-out"
ist.
"not-equal"
wird sofort zurückgegeben, wenn der anfänglichevalue
nicht dem entspricht, was anindex
gespeichert ist."ok"
wird zurückgegeben, wenn durch einen Aufruf vonAtomics.notify()
geweckt wird, unabhängig davon, ob sich der erwartete Wert geändert hat."timed-out"
wird zurückgegeben, wenn eine schlafende Wartezeit das angegebenetimeout
überschreitet, ohne durchAtomics.notify()
geweckt zu werden.
Ausnahmen
TypeError
-
Wird in einem der folgenden Fälle ausgelöst:
- Wenn
typedArray
keinInt32Array
oderBigInt64Array
ist, das einenSharedArrayBuffer
betrachtet. - Wenn der aktuelle Thread nicht blockiert werden kann (zum Beispiel, weil es der Hauptthread ist).
- Wenn
RangeError
-
Wird ausgelöst, wenn
index
imtypedArray
außerhalb des gültigen Bereichs liegt.
Beispiele
Verwendung von wait()
Angenommen, es gibt ein gemeinsames Int32Array
:
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
Ein lesender Thread schläft und wartet auf Position 0, weil der bereitgestellte value
mit dem übereinstimmt, was an der bereitgestellten index
-Position gespeichert ist.
Der lesende Thread wird nicht fortfahren, bis der schreibende Thread Atomics.notify()
auf Position 0 des bereitgestellten typedArray
aufgerufen hat.
Beachten Sie, dass der lesende Thread nicht wieder schlafen geht, wenn nach dem Aufwachen der Wert an Position 0 vom schreibenden Thread nicht geändert wurde, sondern weiter fortfährt.
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
Ein schreibender Thread speichert einen neuen Wert und benachrichtigt den wartenden Thread, nachdem er geschrieben hat:
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-atomics.wait |