Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Atomics.wait()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Dezember 2021 browserübergreifend verfügbar.
Die statische Methode Atomics.wait() überprüft, ob eine gemeinsam genutzte Speicherstelle einen bestimmten Wert enthält und schläft, falls dies der Fall ist, und wartet auf eine Weckbenachrichtigung oder ein Timeout. 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 eine Thread-Synchronisation basierend auf einem Wert im gemeinsamen Speicher zu ermöglichen. Ein Thread kann sofort weitermachen, wenn sich der Synchronisationswert geändert hat, oder er kann auf eine Benachrichtigung eines anderen Threads warten, wenn er die Synchronisationsstelle erreicht.
Diese Methode funktioniert nur mit einer Int32Array oder BigInt64Array, die 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-
Eine
Int32ArrayoderBigInt64Array, die einenSharedArrayBufferbetrachtet. index-
Die Position im
typedArray, auf die gewartet werden soll. value-
Der erwartete Wert, der getestet werden soll.
timeoutOptional-
Zeit in Millisekunden, die gewartet werden soll.
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 wird, unabhängig davon, ob sich der erwartete Wert geändert hat."timed-out"wird zurückgegeben, wenn ein schlafender Zustand das angegebenetimeoutüberschreitet, ohne dass er durchAtomics.notify()geweckt wurde.
Ausnahmen
TypeError-
Wird in einem der folgenden Fälle ausgelöst:
- Wenn
typedArraykeineInt32ArrayoderBigInt64Arrayist, die einenSharedArrayBufferbetrachtet. - Wenn der aktuelle Thread nicht blockiert werden kann (zum Beispiel, weil es der Haupt-Thread ist).
- Wenn
RangeError-
Wird ausgelöst, wenn
indexnicht im Bereich destypedArrayliegt.
Beispiele
Beachten Sie, dass diese Beispiele nicht direkt von der Konsole oder einer beliebigen Webseite aus ausgeführt werden können, da SharedArrayBuffer nicht definiert ist, es sei denn, die Sicherheitsanforderungen werden erfüllt.
Verwendung von Atomics.wait()
Gegeben ein gemeinsames 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 der Stelle 0, weil der bereitgestellte value mit dem in dem bereitgestellten index gespeicherten Wert übereinstimmt. Der lesende Thread wird nicht weitermachen, bis der schreibende Thread Atomics.notify() an Position 0 des bereitgestellten typedArray aufgerufen hat. Beachten Sie, dass der lesende Thread, wenn der Wert an der Stelle 0 nach dem Aufwecken vom schreibenden Thread nicht geändert wurde, nicht wieder schlafen geht, 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
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-atomics.wait> |
