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 Dezember 2021.
Die statische Methode Atomics.wait() überprüft, ob ein gemeinsam genutzter Speicherort einen bestimmten Wert enthält, und schläft, falls dies zutrifft, in Erwartung einer Aufwachbenachrichtigung oder eines Timeouts. Sie gibt einen String zurück, der "not-equal" ist, wenn der Speicherort nicht dem angegebenen Wert entspricht, "ok", wenn er durch Atomics.notify() geweckt wurde, oder "timed-out", wenn das Timeout abläuft.
Atomics.wait() und Atomics.notify() werden zusammen verwendet, um die Thread-Synchronisierung basierend auf einem Wert im gemeinsam genutzten Speicher zu ermöglichen. Ein Thread kann sofort fortfahren, wenn sich der Synchronisationswert geändert hat, oder auf eine Benachrichtigung von einem anderen Thread warten, wenn er den Synchronisationspunkt erreicht.
Diese Methode funktioniert nur mit einem Int32Array oder BigInt64Array, das einen SharedArrayBuffer ansieht. 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
Int32ArrayoderBigInt64Array, das einenSharedArrayBufferansieht. index-
Die Position im
typedArray, auf die gewartet werden soll. value-
Der erwartete Wert, der getestet werden soll.
timeoutOptional-
Wartezeit in Millisekunden.
NaN(und Werte, die inNaNumgewandelt 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 anfänglichevaluenicht dem entspricht, was anindexgespeichert ist."ok"wird zurückgegeben, wenn durch einen Aufruf vonAtomics.notify()geweckt, unabhängig davon, ob sich der erwartete Wert geändert hat."timed-out"wird zurückgegeben, wenn eine schlafende Wartezeit das angegebenetimeoutüberschreitet, ohne vonAtomics.notify()geweckt zu werden.
Ausnahmen
TypeError-
Wird in einem der folgenden Fälle ausgelöst:
- Wenn
typedArraykeinInt32ArrayoderBigInt64Arrayist, das einenSharedArrayBufferansieht. - Wenn der aktuelle Thread nicht blockiert werden kann (zum Beispiel, weil er der Hauptthread ist).
- Wenn
RangeError-
Wird ausgelöst, wenn
indexaußerhalb der Grenzen destypedArrayliegt.
Beispiele
Beachten Sie, dass diese Beispiele nicht direkt von der Konsole oder einer beliebigen Webseite ausgeführt werden können, da SharedArrayBuffer nicht definiert ist, es sei denn, die Sicherheitsanforderungen sind erfüllt.
Verwendung von Atomics.wait()
Gegeben ein gemeinsam genutztes Int32Array:
// Create a SharedArrayBuffer with a size in bytes
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
Ein lesender Thread schläft und wartet an Position 0, weil der bereitgestellte value dem entspricht, was an dem bereitgestellten index gespeichert ist. Der lesende Thread wird nicht weitermachen, bis der schreibende Thread Atomics.notify() auf Position 0 des bereitgestellten typedArray aufgerufen hat. Beachten Sie, dass der lesende Thread nach dem Aufwachen nicht wieder schlafen wird, wenn der Wert an Position 0 nicht vom schreibenden Thread geändert wurde, sondern weitermachen wird.
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
Ein schreibender Thread speichert einen neuen Wert und benachrichtigt den wartenden Thread, sobald er ihn 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> |