Atomics.compareExchange()
Atomics.compareExchange()
静态方法在数组中给定位置交换给定的替换值,如果给定的预期值等于旧值。它返回该位置的旧值,无论它是否等于预期值。此原子操作保证在修改后的值写回之前不会发生其他写入操作。
试一试
语法
js
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
参数
typedArray
-
一个整数类型数组。其中之一为
Int8Array
、Uint8Array
、Int16Array
、Uint16Array
、Int32Array
、Uint32Array
、BigInt64Array
或BigUint64Array
。 index
-
在
typedArray
中交换replacementValue
的位置。 expectedValue
-
要检查相等性的值。
replacementValue
-
要交换的数字。
返回值
给定位置的旧值 (typedArray[index]
)。如果返回值等于 expectedValue
,则交换成功;否则,交换失败。
异常
TypeError
-
如果
typedArray
不是允许的整数类型之一,则抛出此异常。 RangeError
-
如果
index
超出typedArray
的范围,则抛出此异常。
示例
使用 compareExchange()
js
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);
ta[0] = 7;
Atomics.compareExchange(ta, 0, 7, 12); // returns 7, the old value
Atomics.load(ta, 0); // 12
检查返回值
比较并交换 保证新值是根据最新信息计算的;如果该值在此期间已被另一个线程更新,则写入将失败。因此,您应该检查 compareExchange()
的返回值以检查它是否失败,并在必要时重试。
这是一个原子加法器示例(与 Atomics.add()
功能相同),改编自链接的维基百科文章
js
function add(mem, index, value) {
let done = false;
while (!done) {
const value = Atomics.load(mem, index);
done = Atomics.compareExchange(p, value, value + a) === value;
}
return value + a;
}
它首先读取给定索引处的值,然后尝试使用新值更新它。它会一直重试,直到成功更新该值。
规范
规范 |
---|
ECMAScript 语言规范 # sec-atomics.compareexchange |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。