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);
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
См. также
© 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