Atomics.pause()
Baseline 2025>
Neu verfügbar
Seit April 2025 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.
Die statische Methode Atomics.pause() stellt ein Primitiv für eine sehr kurze Wartezeit bereit. Sie signalisiert der CPU, dass der Aufrufer in einer Schleife auf den Zugriff auf eine gemeinsam genutzte Ressource wartet. Dadurch kann das System die dem Prozessorkern oder Thread zugewiesenen Ressourcen, etwa die Leistungsaufnahme, reduzieren, ohne die Ausführung des aktuellen Threads abzugeben.
pause() hat außer einer möglichen Auswirkung auf die zeitliche Ausführung kein beobachtbares Verhalten. Das genaue Verhalten hängt von der CPU-Architektur und dem Betriebssystem ab. Auf Intel x86 kann beispielsweise eine pause-Instruktion gemäß Intels Optimierungshandbuch ausgeführt werden. Auf bestimmten Plattformen kann der Aufruf wirkungslos sein.
Syntax
Atomics.pause()
Parameter
Keine.
Rückgabewert
Keiner (undefined).
Beispiele
Diese Beispiele können nicht direkt in der Konsole oder auf einer beliebigen Webseite ausgeführt werden, da SharedArrayBuffer nur definiert ist, wenn seine Sicherheitsanforderungen erfüllt sind.
Atomics.pause() verwenden
Wenn Atomics.wait() oder Atomics.waitAsync() aufgerufen wird, um auf den Zugriff auf gemeinsam genutzten Speicher zu warten, wird die Ausführung des Threads auf dem Prozessorkern ausgesetzt und nach dem Warten wieder aufgenommen. Das ist bei hoher Zugriffskonkurrenz effizient, wenn der Zugriff auf den gemeinsam genutzten Speicher einige Zeit dauern kann. Bei geringer Zugriffskonkurrenz ist es dagegen oft effizienter, die Sperre wiederholt zu prüfen, ohne die Ausführung des Threads abzugeben. Dieser Ansatz wird als Busy Waiting oder Spinlocking bezeichnet. Die Methode pause() macht Spinlocking während des Wartens effizienter, indem sie der CPU signalisiert, was der Thread gerade tut und dass er daher nur wenige Ressourcen benötigt.
Um beide Situationen abzudecken, wird häufig zunächst per Spinlocking auf die Sperre gewartet, in der Annahme, dass die Zugriffskonkurrenz gering ist. Wird die Sperre nach kurzer Zeit nicht erlangt, geht der Thread in den Wartezustand über. Wurde die Sperre bereits durch Spinlocking erlangt, wird der Aufruf von wait() übersprungen.
Das folgende Beispiel zeigt, wie sich dieser Ansatz mit Atomics.pause() und Atomics.wait() umsetzen lässt.
Warnung: Spinlocking im Hauptthread wird nicht empfohlen, da dadurch die gesamte Seite blockiert wird. Sofern sie nicht sehr sorgfältig konzipiert sind, bieten Spinlocks im Allgemeinen möglicherweise keinen Leistungsvorteil gegenüber einem regulären Wartevorgang.
// Imagine another thread also has access to this shared memory
const sab = new SharedArrayBuffer(1024);
const i32 = new Int32Array(sab);
function lock() {
while (true) {
// Fast path: spin the CPU for a short while
let spin = 0;
do {
if (Atomics.compareExchange(i32, 0, 0, 1) === 0) {
return;
}
Atomics.pause();
spin++;
} while (spin < 10);
// Slow path: wait for the lock
// This can only be called in a worker thread,
// because the main thread cannot be blocked
Atomics.wait(i32, 0, 1);
}
}
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-atomics.pause> |