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 eine Mikro-Warte-Primitiv zur Verfügung, die der CPU andeutet, dass der Aufrufer auf den Zugriff auf eine gemeinsam genutzte Ressource wartet. Dadurch kann das System die zugewiesenen Ressourcen für den Kern (wie Leistung) oder Thread reduzieren, ohne den aktuellen Thread abzugeben.
pause() hat kein beobachtbares Verhalten außer der zeitlichen Wirkung. Das genaue Verhalten hängt von der CPU-Architektur und dem Betriebssystem ab. Zum Beispiel kann es auf Intel x86 eine pause-Anweisung gemäß Intels Optimierungs-Handbuch sein. Auf manchen Plattformen könnte es ein no-op sein.
Syntax
Atomics.pause()
Parameter
Keine.
Rückgabewert
Keiner (undefined).
Beispiele
Beachten Sie, dass diese Beispiele nicht direkt in der Konsole oder einer beliebigen Webseite ausgeführt werden können, da SharedArrayBuffer nicht definiert ist, es sei denn, seine Sicherheitsanforderungen sind erfüllt.
Verwendung von Atomics.pause()
Der Aufruf von Atomics.wait() oder Atomics.waitAsync(), um auf den Zugriff auf geteilten Speicher zu warten, bewirkt, dass der Thread aus dem Kern herausgeplant wird und dann nach der Wartezeit wieder herein, was während Zeiten hoher Konkurrenz effizient ist, in denen der Zugriff auf den geteilten Speicher einige Zeit in Anspruch nehmen könnte. Wenn die Konkurrenz gering ist, ist es oft effizienter, die Sperre abzufragen, ohne den Thread abzugeben: Dieser Ansatz wird als Busy Waiting oder Spinlocking bezeichnet. Die Methode pause() ermöglicht es Ihnen, effizienter während des Wartens zu Spinlocken, indem sie der CPU einen Hinweis gibt, was der Thread tut, und dadurch sein geringes Ressourcenbedürfnis anzeigt.
Um beiden Bedingungen gerecht zu werden, besteht ein gängiger Ansatz darin, zuerst zu Spinlocken, in der Hoffnung, dass die Konkurrenz gering ist, und dann zu warten, wenn die Sperre nicht nach kurzer Zeit erlangt wird. Wenn wir die Sperre bereits durch Spinlocking erlangt haben, wird der wait()-Aufruf ein no-op sein.
Das folgende Beispiel zeigt, wie dieser Ansatz mit Atomics.pause() und Atomics.wait() verwendet werden kann.
Warnung: Die Verwendung von Spinlocking auf dem Hauptthread wird nicht empfohlen, da dadurch die gesamte Seite einfriert. Allgemein gilt, dass Spinlocks, sofern sie nicht sehr sorgfältig entworfen werden, möglicherweise nicht tatsächlich leistungsfähiger sind als ein reguläres Warten.
// Imagine another thread also has access to this shared memory
const sab = new SharedArrayBuffer(1024);
const i32 = new Int32Array(sab);
// Fast path: spin the CPU for a short while
let spin = 0;
do {
if (Atomics.compareExchange(i32, 0, 0, 1) === 0) {
break;
}
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 |
|---|
| Atomics.pause> # Atomics.pause> |