diff --git a/zh-cn/application-dev/reference/native-lib/arkts1.2-atomics.md b/zh-cn/application-dev/reference/native-lib/arkts1.2-atomics.md new file mode 100644 index 0000000000000000000000000000000000000000..fa73be0b8f405a88b8896498a41b5261d9e29bc7 --- /dev/null +++ b/zh-cn/application-dev/reference/native-lib/arkts1.2-atomics.md @@ -0,0 +1,949 @@ +# Atomics (原子操作) +- Atomics用于解决多线程并发编程中的竞态条件问题,确保对共享数据的并发操作安全。 +- Atomics的所有方法都是静态方法,数据通过第一个参数`typedArray`传递。 +- `typedArray`指一类数组数据类型,具体请见下文表格。 +- `typedArray`依赖`ArrayBuffer`构建。 + +Atomics的各个方法不是每种`typedArray`都支持,各方法支持类型见下表: + +**类型支持表:** +| function |Int8Array|Int16Array|Int32Array|Uint8Array|Uint16Array|Uint32Array|BigInt64Array|BigUint64Array| +|--|--|--|--|--|--|--|--|--| +|add|支持|支持|支持|支持|支持|支持|支持|支持| +|and|支持|支持|支持|支持|支持|支持|支持|支持| +|compareExchange|支持|支持|支持|支持|支持|支持|支持|支持| +|exchange|支持|支持|支持|支持|支持|支持|支持|支持| +|load|支持|支持|支持|支持|支持|支持|支持|支持| +|notify|不支持|不支持|支持|不支持|不支持|不支持|支持|不支持| +|or|支持|支持|支持|支持|支持|支持|支持|支持| +|store|支持|支持|支持|支持|支持|支持|支持|支持| +|sub|支持|支持|支持|支持|支持|支持|支持|支持| +|wait|不支持|不支持|支持|不支持|不支持|不支持|支持|不支持| +|waitAsync|不支持|不支持|支持|不支持|不支持|不支持|支持|不支持| +|xor|支持|支持|支持|支持|支持|支持|支持|支持| + +为了方便在各方法中表示支持的类型,将类型分为以下别名: +- **smalltypeArray**: Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array +- **bigtypeArray**: BigInt64Array | BigUint64Array + +## add + +static add(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]与value进行加法运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在修改typedArray[index]之前,不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | 执行运算的操作数,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改之前的值,与smalltypeArray中的元素类型一致,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) + +let old = Atomics.add(ta, 0, 12) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //0 +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` + +## add + +static add(typedArray: bigtypeArray, index: number, value: bigint): bigint + +将typedArray[index]与value进行加法运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | 执行运算的操作数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改之前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) + +let old = Atomics.add(ta, 0, 12n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //0 +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` + +## and + +static and(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]与value进行按位与运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | 执行运算的操作数,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改之前的值,与smalltypeArray中的元素类型一致,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) +ta[0] = 3 + +let old = Atomics.and(ta, 0, 2) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //3 +hilog.info(0x0000, "testTag", "res is:" + re) //2 +``` +## and + +static and(typedArray: bigtypeArray, index: number, value: bigint): bigint + +将typedArray[index]与value进行按位与运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | 执行运算的操作数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改之前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024); +let ta = new BigInt64Array(ab); +ta[0] = 3n + +let old = Atomics.and(ta, 0, 2n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //3 +hilog.info(0x0000, "testTag", "res is:" + re) //2 +``` + +## compareExchange + +static compareExchange(typedArray: smalltypeArray, index: number, expectedValue: number, replacementValue: number): number + +如果typedArray[index]等于expectedValue,将typedArray[index]赋值为replacementValue,如果不相等则不做任何处理。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| expectedValue | number | 是 | 用于检查与typedArray[index]是否相等的值,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | +| replacementValue | number | 是 | typedArray[index]要被替换的值,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改之前的值,与smalltypeArray中的元素类型一致,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) +ta[0] = 7 + +let old = Atomics.compareExchange(ta, 0, 7, 12) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //7 +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` +## compareExchange + +static compareExchange(typedArray: bigtypeArray, index: number, expectedValue: bigint, replacementValue: bigint): bigint + +如果typedArray[index]等于expectedValue,将typedArray[index]赋值为replacementValue,如果不相等则不做任何处理。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | -------------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| expectedValue | bigint | 是 | 用于检查与typedArray[index]是否相等的值。 | +| replacementValue | bigint | 是 | typedArray[index]要被替换的值。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改之前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) +ta[0] = 7n + +let old = Atomics.compareExchange(ta, 0, 7n, 12n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //7 +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` + +## exchange + +static exchange(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]赋值为value。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | typedArray[index]要被修改为的值,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改前的值,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) + +let old = Atomics.exchange(ta, 0, 12) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //0 +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` +## exchange + +static exchange(typedArray: bigtypeArray, index: number, value: bigint): bigint + +将typedArray[index]赋值为value。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | typedArray[index]要被修改为的值。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) + +let old = Atomics.exchange(ta, 0, 12n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //0 +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` + +## isLockFree + +static isLockFree(byteSize: int): boolean + +Atomics的方法对数据字节大小有要求,只有符合字节大小要求的才能使用Atomics的方法。 +此方法判断byteSize字节的大小是否适用于Atomics的方法。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| byteSize | int | 是 | 要判断是否可使用Atomics方法的字节大小。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| boolean | 返回一个布尔值,表示是否可使用Atomics方法,true代表可以使用,false代表不可以使用。 | + +**示例:** +```ts +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(1)) //true +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(2)) //true +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(3)) //false +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(4)) //true +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(5)) //false +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(6)) //false +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(7)) //false +hilog.info(0x0000, "testTag", "res is:" + Atomics.isLockFree(8)) //true +``` + +## load + +static load(typedArray: smalltypeArray, index: number): number + +返回typedArray[index]的值。 +此方法确保在typedArray[index]被加载之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]的值,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024); +let ta = new Uint8Array(ab); + +Atomics.add(ta, 0, 12); +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` +## load + +static load(typedArray: BigInt64Array, index: number): bigint + +返回typedArray[index]的值。 +此方法确保在typedArray[index]被加载之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | BigInt64Array | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) + +Atomics.add(ta, 0, 12n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` +## load + +static load(typedArray: BigUint64Array, index: number): bigint + +返回typedArray[index]的值。 +此方法确保在typedArray[index]被加载之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | BigUint64Array | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigUint64Array(ab) + +Atomics.add(ta, 0, 12n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` + +## notify + +static notify(typedArray: Int32Array | BigInt64Array, index: number, count?: number): int + +唤醒一些在等待typedArray[index]的Waiter。count可以指定唤醒Waiter的个数。 +调用Atomics.wait(typedArray, index, value)会在typedArray[index]处产生一个Waiter。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | Int32Array \| BigInt64Array | 是 | 要操作的数组。 | +| index | number | 是 |typedArray中的索引,不能为负数。 | +| count | number | 否 | 要唤醒的休眠Waiter的数量。不能为负数,默认为Infinity。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| int | 返回被唤醒的Waiter数量。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Index out of bounds" | 访问typedArray越界。
可能原因:index超出typedArray的边界。
处理步骤:确保传入的index在typedArray的范围内。如果无法保证,建议捕获 RangeError 异常。 | + +**示例:** +```ts +function FuncWait(arr: BigInt64Array): void { + let re = Atomics.wait(arr, 0, 0n, 3000) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //ok +} + +function FuncNotify(arr: BigInt64Array): void { + let re = Atomics.wait(arr, 0, 0n, 1000) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //timed-out + + Atomics.notify(arr, 0) +} + +function testMain(): void { + let buf = new ArrayBuffer(1024) + let arr: BigInt64Array = new BigInt64Array(buf, 0) + + Atomics.store(arr, 0, 0n) + let re = Atomics.wait(arr, 0, 1n) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //not-equal + + let p1 = launch void>(FuncWait, arr) + FuncNotify(arr) + p1.Await() +} +``` + +## or + +static or(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]与value进行按位或运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | 执行运算的操作数,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改之前的值,与smalltypeArray中的元素类型一致,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) +ta[0] = 2 + +let old = Atomics.or(ta, 0, 1) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //2 +hilog.info(0x0000, "testTag", "res is:" + re) //3 +``` +## or + +static or(typedArray: bigtypeArray, index: number, value: number): number + +将typedArray[index]与value进行按位或运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | 执行运算的操作数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改之前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) +ta[0] = 2n + +let old = Atomics.or(ta, 0, 1n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //2 +hilog.info(0x0000, "testTag", "res is:" + re) //3 +``` + +## store + +static store(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]赋值为value,并返回该值。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | 执行运算的操作数,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回要存储的新值value,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) + +let re = Atomics.store(ta, 0, 12) +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` +## store + +static store(typedArray: bigtypeArray, index: number, value: bigint): bigint + +将typedArray[index]赋值为value,并返回该值。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | 执行运算的操作数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回要存储的新值value,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) + +let re = Atomics.store(ta, 0, 12n) +hilog.info(0x0000, "testTag", "res is:" + re) //12 +``` + +## sub + +static sub(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]与value做减法,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | 执行运算的操作数,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改之前的值,与smalltypeArray中的元素类型一致,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) +ta[0] = 48 + +let old = Atomics.sub(ta, 0, 12) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //48 +hilog.info(0x0000, "testTag", "res is:" + re) //36 +``` +## sub + +static sub(typedArray: bigtypeArray, index: number, value: bigint): bigint + +将typedArray[index]与value做减法,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | typedArray[index]要减的值。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改之前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) +ta[0] = 48n + +let old = Atomics.sub(ta, 0, 12n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //48 +hilog.info(0x0000, "testTag", "res is:" + re) //36 +``` + +## wait + +static wait(typedArray: Int32Array, index: number, value: number, timeout?: number): string + +验证typedArray[index]是否等于value。如果不相等就直接返回"not-equal"。如果相等则进行等待状态。 +等待状态下如果收到notify,则结束等待并返回"ok",如果设置了timeout超时时间,超过超时时间则不再等待并返回"time-out",否则一直等待。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | Int32Array | 是 | 要操作的数组。 | +| index | number | 是 |typedArray中的索引,不能为负数。 | +| value | number | 是 | typedArray[index]要比较相等性的数据。Int32类型取值范围 | +| timeout | number | 否 | 超时时间,单位毫秒(ms),不可为负数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| string | 返回等待结果。
"not-equal":typedArray[index]不等于value;"ok":
等待期间收到另外一个协程notfiy;
"timed-out":等待超过设置的timeout超时时间。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Index out of bounds" | 访问typedArray越界。
可能原因:index超出typedArray的边界。
处理步骤:确保传入的index在typedArray的范围内。如果无法保证,建议捕获 RangeError 异常。 | + +**示例:** +```ts +function FuncWait(arr: Int32Array): void { + let re = Atomics.wait(arr, 0, 0, 3000) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //ok +} + +function FuncNotify(arr: Int32Array): void { + let re = Atomics.wait(arr, 0, 0, 1000) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //timed-out + + Atomics.notify(arr, 0) +} + +function testMain(): void { + let buf = new ArrayBuffer(1024) + let arr: Int32Array = new Int32Array(buf, 0) + + Atomics.store(arr, 0, 0) + let re = Atomics.wait(arr, 0, 1) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //not-equal + + let p1 = launch void>(FuncWait, arr) + FuncNotify(arr) + p1.Await() +} +``` +## wait + +static wait(typedArray: BigInt64Array, index: nubmer, value: bigint, timeout?: number): string + +验证typedArray[index]是否等于value。如果不相等就直接返回"not-equal"。如果相等则进行等待状态。 +等待状态下如果收到notify,则结束等待并返回"ok",如果设置了timeout超时时间,超过超时时间则不再等待并返回"time-out",否则一直等待。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | BigInt64Array | 是 | 要操作的数组。 | +| index | number | 是 |typedArray中的索引,不能为负数。 | +| value | bigint | 是 | typedArray[index]要比较相等性的数据。 | +| timeout | number | 否 | 超时时间,单位毫秒(ms),不可为负数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| string | 返回等待结果。
"not-equal":typedArray[index]不等于value;"ok":
等待期间收到另外一个协程notfiy;
"timed-out":等待超过设置的timeout超时时间。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Index out of bounds" | 访问typedArray越界。
可能原因:index超出typedArray的边界。
处理步骤:确保传入的index在typedArray的范围内。如果无法保证,建议捕获 RangeError 异常。 | + +**示例:** +```ts +function FuncWait(arr: BigInt64Array): void { + let re = Atomics.wait(arr, 0, 0n, 3000) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //ok +} + +function FuncNotify(arr: BigInt64Array): void { + let re = Atomics.wait(arr, 0, 0n, 1000) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //timed-out + + Atomics.notify(arr, 0) +} + +function testMain(): void { + let buf = new ArrayBuffer(1024) + let arr: BigInt64Array = new BigInt64Array(buf, 0) + + Atomics.store(arr, 0, 0n) + let re = Atomics.wait(arr, 0, 1n) + hilog.info(0x0000, "testTag", "Atomics result: " + re) //not-equal + + let p1 = launch void>(FuncWait, arr) + FuncNotify(arr) + p1.Await() +} +``` + +## waitAsync + +async static waitAsync(typedArray: Int32Array | BigInt64Array, index: number, value: bigint, timeout?: number): Promise\ + +等待共享内存的特定位置,与wait不同不会阻塞调用者。 +等待结果可通过返回值获得。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | Int32Array \| BigInt64Array | 是 | 要操作的数组。 | +| index | number | 是 |typedArray中的索引,不能为负数。 | +| value | bigint | 是 | typedArray[index]要比较相等性的数据。 | +| timeout | number | 否 | 超时时间,单位毫秒(ms),不可为负数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| Promise\ | 返回等待结果。
"not-equal":typedArray[index]不等于value;
"ok":等待期间收到另外一个协程notfiy;
"timed-out":等待超过设置的timeout超时时间。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Index out of bounds" | 访问typedArray越界。
可能原因:index超出typedArray的边界。
处理步骤:确保传入的index在typedArray的范围内。如果无法保证,建议捕获 RangeError 异常。 | + +**示例:** +```ts +function FuncWaitAsync(arr: Int32Array): void { + Atomics.store(arr, 0, 0) + + let re: Promise = Atomics.waitAsync(arr,0, 1n) + re.then((value: string): void => { + hilog.info(0x0000, "testTag", value) // not-equal + }, (err: Error): void => { + hilog.info(0x0000, "testTag", "Test failed. The promise shouldn`t be rejected.") + }); + + let re2 = Atomics.waitAsync(arr, 0, 0n, 2000) + re2.then((value: string): void => { + hilog.info(0x0000, "testTag", value) // timed-out + }, (err: Error): void => { + hilog.info(0x0000, "testTag", "Test failed. The promise shouldn`t be rejected.") + }); + + let re3 = Atomics.waitAsync(arr, 0, 0n, 10000) + re3.then((value: string): void => { + hilog.info(0x0000, "testTag", value) // ok + }, (err: Error): void => { + hilog.info(0x0000, "testTag", "Test failed. The promise shouldn`t be rejected.") + }); +} + +function FuncNotify(arr: Int32Array): void { + setTimeout(() => { + Atomics.notify(arr, 0) + }, 5000); +} + +function testMain(): void { + let buf = new ArrayBuffer(1024); + let arr: Int32Array = new Int32Array(buf, 0); + FuncWaitAsync(arr) + FuncNotify(arr) +} +``` + +## xor + +static xor(typedArray: smalltypeArray, index: number, value: number): number + +将typedArray[index]与value进行按位异或运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | smalltypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | number | 是 | 执行运算的操作数,对应smalltypeArray中的元素类型,可为负数,不可为浮点数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| number | 返回typedArray[index]被修改之前的值,与smalltypeArray中的元素类型一致,可为负数,不可为浮点数。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new Uint8Array(ab) +ta[0] = 5 + +let old = Atomics.xor(ta, 0, 1) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //5 +hilog.info(0x0000, "testTag", "res is:" + re) //4 +``` +## xor + +static xor(typedArray: bigtypeArray, index: number, value: bigint): bigint + +将typedArray[index]与value进行按位异或运算,结果写回typedArray[index]。 +此方法返回typedArray[index]被修改之前的值。 +此方法确保在typedArray[index]被修改之前,typedArray[index]不会发生其他线程的读写操作。 + +**参数:** +| 名称 | 类型 | 必填 | 说明 | +| -------- | --------------------------------------- | ---- | ---------------------- | +| typedArray | bigtypeArray | 是 | 要操作的数组。 | +| index | number | 是 | typedArray中的索引。 | +| value | bigint | 是 | 执行运算的操作数。 | + +**返回值:** +| 类型 | 说明 | +| ----------- | --------------------------- | +| bigint | 返回typedArray[index]被修改之前的值。 | + +**错误信息** +| 错误信息 | 说明 | +| ----------- | --------------------------- | +| "Unhandled array type!" | typedArray不在类型范围内 | + +**示例:** +```ts +let ab = new ArrayBuffer(1024) +let ta = new BigInt64Array(ab) +ta[0] = 5n + +let old = Atomics.xor(ta, 0, 1n) +let re = Atomics.load(ta, 0) +hilog.info(0x0000, "testTag", "old is:" + old) //5 +hilog.info(0x0000, "testTag", "res is:" + re) //4 +```