Atomics.pause()
Базовый уровень Недавно доступно
Эта функция работает на последних устройствах и версиях браузеров. Эта функция может не работать в старых устройствах или версиях браузеров. Она доступна во всех браузерах с апреля 2025 года.
Статический метод Atomics.pause() предоставляет примитив микро-ожидания, который намекает ЦП, что вызывающий код выполняет "вращение" (spinning), ожидая доступа к общему ресурсу. Это позволяет системе уменьшить ресурсы, выделенные ядру (например, питание) или потоку, не уступая текущий поток.
pause() не имеет наблюдаемого поведения, кроме задержки по времени. Точное поведение зависит от архитектуры ЦП и операционной системы. Например, в Intel x86 это может быть инструкция pause согласно руководству по оптимизации Intel. На некоторых платформах это может быть no-op (пустая операция).
Синтаксис
Atomics.pause()
Параметры
Нет.
Возвращаемое значение
Нет (undefined).
Примеры
Обратите внимание, что эти примеры нельзя запустить непосредственно из консоли или произвольной веб-страницы, поскольку SharedArrayBuffer не определен, если не выполнены его требования безопасности.
Использование Atomics.pause()
Вызов Atomics.wait() или Atomics.waitAsync() для ожидания доступа к общей памяти приводит к тому, что поток выгружается из ядра, а затем снова загружается после ожидания. Это эффективно во время высокой конкуренции, когда доступ к общей памяти может занять некоторое время. Когда конкуренция низка, часто более эффективно опрашивать блокировку без уступки потока: этот подход известен как активное ожидание (busy waiting) или спинблокировка (spinlocking). Метод pause() позволяет более эффективно выполнять спинблокировку во время ожидания, предоставляя ЦП подсказку о том, что делает поток, и, следовательно, о его низкой потребности в ресурсах.
Чтобы учесть оба условия, распространенный подход заключается в том, чтобы сначала выполнить спинблокировку в надежде, что конкуренция низка, а затем перейти к ожиданию, если блокировка не получена через короткое время. Если мы уже получили блокировку с помощью спинблокировки, то вызов wait() будет пустой операцией (no-op).
Пример ниже показывает, как этот подход может быть использован с Atomics.pause() и Atomics.wait().
Предупреждение: Использование спинблокировки в основном потоке не рекомендуется, так как это заморозит всю страницу. В целом, если спинблокировки не разработаны очень тщательно, они могут быть не более производительными, чем обычное ожидание.
// 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);
Спецификации
| Спецификация |
|---|
| Atomics.pause # Atomics.pause |
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
pause |
133 |
133 |
137 |
118 |
18.4 |
133 |
137 |
88 |
18.4 |
29.0 |
133 |
18.4 |
1.1.31 |
2.2 |
No |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/pause