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 gemeinsame Speicherstelle einen bestimmten Wert enthält, und falls ja, schläft sie, bis sie eine Weckbenachrichtigung oder ein Timeout erhält. Sie gibt einen String zurück, der entweder "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 gemeinsamen Speicher zu ermöglichen. Ein Thread kann sofort fortfahren, wenn sich der Synchronisationswert geändert hat, oder er kann auf eine Benachrichtigung von einem anderen Thread warten, wenn er den Synchronisationspunkt erreicht hat.
Diese Methode funktioniert nur mit einem Int32Array
oder BigInt64Array
, das einen SharedArrayBuffer
betrachtet. Sie ist blockierend und kann nicht im Haupt-Thread 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 getestet wird.
timeout
Optional-
Zeit in Millisekunden, die gewartet wird.
NaN
(und Werte, die inNaN
umgewandelt werden, wieundefined
) 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 Anfangswertvalue
nicht dem entspricht, was anindex
gespeichert ist."ok"
wird zurückgegeben, wenn das Wecken durch einen Aufruf vonAtomics.notify()
erfolgt, unabhängig davon, ob sich der erwartete Wert geändert hat."timed-out"
wird zurückgegeben, wenn ein wartender Thread das angegebenetimeout
überschreitet, ohne durchAtomics.notify()
geweckt zu werden.
Ausnahmen
TypeError
-
Wird in einem der folgenden Fälle ausgelöst:
- Falls
typedArray
keinInt32Array
oderBigInt64Array
ist, das einenSharedArrayBuffer
betrachtet. - Falls der aktuelle Thread nicht blockiert werden kann (z.B. weil es der Haupt-Thread ist).
- Falls
RangeError
-
Wird ausgelöst, wenn
index
außerhalb der Grenzen destypedArray
liegt.
Beispiele
Verwendung von wait()
Angenommen, ein gemeinsames Int32Array
:
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
Ein lesender Thread schläft und wartet an Position 0, weil der angegebene value
mit dem übereinstimmt, was an dem angegebenen index
gespeichert ist. Der lesende Thread wird nicht weitermachen, bis der schreibende Thread Atomics.notify()
auf Position 0 des angegebenen typedArray
aufgerufen hat. Beachten Sie, dass der lesende Thread nicht wieder einschläft, nachdem er geweckt wurde, falls der Wert an Position 0 vom schreibenden Thread nicht geändert wurde, sondern weitermacht.
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
Ein schreibender Thread speichert einen neuen Wert und benachrichtigt den wartenden Thread, sobald 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 |