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 Atomics.wait() statische Methode überprüft, ob eine geteilte Speicherstelle immer noch einen bestimmten Wert enthält und wartet, wenn dies zutrifft, auf eine Weckbenachrichtigung oder läuft ab. Sie gibt einen String zurück, der entweder "ok", "not-equal" oder "timed-out" ist.

Hinweis: Diese Operation funktioniert nur mit einem Int32Array oder BigInt64Array, das einen SharedArrayBuffer betrachtet, und darf möglicherweise nicht im Hauptthread ausgeführt werden. Für eine nicht blockierende, asynchrone Version dieser Methode siehe Atomics.waitAsync().

Syntax

js
Atomics.wait(typedArray, index, value)
Atomics.wait(typedArray, index, value, timeout)

Parameter

typedArray

Ein Int32Array oder BigInt64Array, das einen SharedArrayBuffer betrachtet.

index

Die Position im typedArray, auf die gewartet werden soll.

value

Der erwartete Wert zum Testen.

timeout Optional

Wartezeit in Millisekunden. NaN (und Werte, die in NaN umgewandelt werden, wie undefined) wird zu Infinity. Negative Werte werden zu 0.

Rückgabewert

Ein String, der entweder "ok", "not-equal" oder "timed-out" ist.

  • "ok" wird zurückgegeben, wenn durch einen Aufruf von Atomics.notify() aufgeweckt, unabhängig davon, ob sich der erwartete Wert geändert hat
  • "not-equal" wird sofort zurückgegeben, wenn der anfängliche value nicht dem im index gespeicherten Wert entspricht
  • "timed-out" wird zurückgegeben, wenn eine schlafende Wartezeit den angegebenen timeout überschreitet, ohne durch Atomics.notify() aufgeweckt zu werden

Ausnahmen

TypeError

Wird in einem der folgenden Fälle ausgelöst:

  • Wenn typedArray nicht ein Int32Array oder BigInt64Array ist, das einen SharedArrayBuffer betrachtet.
  • Wenn der aktuelle Thread nicht blockiert werden kann (zum Beispiel, weil es der Hauptthread ist).
RangeError

Wird ausgelöst, wenn index außerhalb der Grenzen des typedArray liegt.

Beispiele

Verwendung von wait()

Angenommen, es gibt einen geteilten Int32Array:

js
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

Ein lesender Thread schläft und wartet an der Position 0, weil der angegebene value mit dem übereinstimmt, was an dem angegebenen index gespeichert ist. Der lesende Thread wird erst fortfahren, wenn der schreibende Thread Atomics.notify() an Position 0 des bereitgestellten typedArray aufgerufen hat. Beachten Sie, dass wenn der Wert an Position 0 nach dem Aufwachen nicht vom schreibenden Thread geändert wurde, der lesende Thread nicht wieder einschlafen wird, sondern fortfahren wird.

js
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:

js
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);

Spezifikationen

Specification
ECMAScript Language Specification
# sec-atomics.wait

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch