Spec-Zone.ru › JavaScript

Atomics.wait()

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с декабря 2021 года.

Статический метод Atomics.wait() проверяет, содержит ли область общей памяти заданное значение, и, если это так, переводит поток в спящий режим, ожидая уведомления о пробуждении или тайм-аута. Он возвращает строку, которая будет "not-equal", если область памяти не соответствует заданному значению, "ok", если поток разбужен с помощью Atomics.notify(), или "timed-out", если истек тайм-аут.

Atomics.wait() и Atomics.notify() используются вместе для обеспечения синхронизации потоков на основе значения в общей памяти. Поток может продолжить работу немедленно, если значение синхронизации изменилось, или он может ожидать уведомления от другого потока, когда достигнет точки синхронизации.

Этот метод работает только с Int32Array или BigInt64Array, которые представляют собой представление SharedArrayBuffer. Он является блокирующим и не может использоваться в основном потоке. Неблокирующую, асинхронную версию этого метода см. в Atomics.waitAsync().

Синтаксис

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

Параметры

typedArray
Int32Array или BigInt64Array, которые представляют собой представление SharedArrayBuffer.
index
Позиция в typedArray, в которой необходимо ожидать.
value
Ожидаемое значение для проверки.
timeout Необязательно
Время ожидания в миллисекундах. NaN (и значения, которые преобразуются в NaN, такие как undefined) становится Infinity. Отрицательные значения становятся 0.

Возвращаемое значение

Строка, которая является либо "not-equal", "ok", либо "timed-out".

  • "not-equal" возвращается немедленно, если начальный value не равен тому, что хранится в index.
  • "ok" возвращается, если поток был разбужен вызовом Atomics.notify(), независимо от того, изменилось ли ожидаемое значение.
  • "timed-out" возвращается, если ожидание в спящем режиме превышает указанное timeout без пробуждения с помощью Atomics.notify().

Исключения

TypeError
Выбрасывается в одном из следующих случаев:
  • Если typedArray не является Int32Array или BigInt64Array, которые представляют собой представление SharedArrayBuffer.
  • Если текущий поток не может быть заблокирован (например, потому что это основной поток).
RangeError
Выбрасывается, если index выходит за границы в typedArray.

Примеры

Обратите внимание, что эти примеры не могут быть запущены непосредственно из консоли или произвольной веб-страницы, поскольку SharedArrayBuffer не определен, если не соблюдены его требования безопасности.

Использование Atomics.wait()

Дано общее Int32Array:

// Create a SharedArrayBuffer with a size in bytes
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

Читающий поток переходит в спящий режим и ожидает в позиции 0, потому что предоставленный value соответствует тому, что хранится в предоставленном index. Читающий поток не продвинется дальше, пока записывающий поток не вызовет Atomics.notify() в позиции 0 предоставленного typedArray. Обратите внимание, что если после пробуждения значение позиции 0 не было изменено записывающим потоком, читающий поток не вернется в спящий режим, а продолжит работу.

Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123

Записывающий поток сохраняет новое значение и уведомляет ожидающий поток после записи:

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

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-atomics.wait

Совместимость с браузерами

Десктопные Мобильные Серверные
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
wait
68
79
78
55
15.2
89
79
63
15.2
15.0
89
15.2
1.0.0
1.0
8.10.0

См. также

  • Atomics
  • Atomics.waitAsync()
  • Atomics.notify()

© 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/wait

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API