📜  JavaScript 中的原子

📅  最后修改于: 2022-05-13 01:56:52.067000             🧑  作者: Mango

JavaScript 中的原子

Atomics: Atomics 是一个 JavaScript 对象,它使原子任务作为静态策略进行。与 Math 对象的策略非常相似,Atomics 的技术和属性也是静态的。原子与 SharedArrayBuffer 对象一起使用。原子活动是在原子模块上介绍的。与其他全球文章相比,Atomics 不是构造函数。原子不能与其他管理员一起使用,也不能作为一种能力被召唤。

原子操作:原子操作不是连续的。当内存共享时,多个线程可以在内存中读取和写入数据。如果任何数据发生更改,则会丢失数据 原子操作确保数据被预测值写入和准确读取。在当前操作完成并且原子操作将开始之前,无法更改现有信息。

方法:

  • 原子.add(): 将提供的值添加到指定数组索引中的当前值。返回旧的索引值。
  • 原子.and(): 值 AND 是根据提供的值指定的数组的索引按位计算的。返回该索引的旧值。
  • 原子交换(): 在指定的数组索引处指定一个值。返回旧值。
  • Atomics.compareExchange(): 如果值相同,则指定指定数组索引中的值。旧值返回。
  • Atomics.isLockFree(大小): 用于确定是否要使用锁或原子操作的原始优化。如果在给定元素大小的数组中执行硬件原子操作(与锁相反),则返回 true。
  • 原子加载(): 该值返回到指定的数组索引。
  • Atomics.or():按位或计算指定数组索引处给定值的值。返回旧的索引值。
  • Atomics.notify(): 通知代理等待指定的数组索引。返回通知的代理数量。
  • 原子.sub(): 删除指定数组索引处的值。返回旧的索引值。
  • 原子商店(): 在指定的数组索引上保存一个值。返回值。
  • 原子。等待(): 验证指定的数组索引是否仍有值,并且等待或等待时间处于休眠状态。返回“ok”、“not the same”或“time-out”。如果调用代理无法等待,它会抛出一个错误异常。
  • 原子.xor(): 用给定数组索引上的给定值计算按位异或。返回旧的索引值。

示例 1:

Javascript
var buffer = new 
// create a SharedArrayBuffer
SharedArrayBuffer(50); 
var a = new Uint8Array(buffer);
// Initialising element at zeroth position of array with 9 
a[0] = 9;
console.log(Atomics.load(a, 0)); 
// Displaying the return value of the Atomics.store() method
console.log(Atomics.store(a, 0, 3)); 
// Displaying the updated SharedArrayBuffer 
console.log(Atomics.load(a, 0));


Javascript
const buffer = new SharedArrayBuffer(2048);
  
const ta = new Uint8Array(buffer);
  
ta[0]; // 0
  
ta[0] = 5; // 5
  
Atomics.add(ta, 0, 12);   // 5
  
Atomics.load(ta, 0);      // 17
  
Atomics.and(ta, 0, 1); // 17
  
Atomics.load(ta, 0); // 1
  
Atomics.exchange(ta, 0, 12); // 1
  
Atomics.load(ta, 0); // 12
  
Atomics.compareExchange(ta, 0, 5, 12); // 1
  
Atomics.load(ta, 0); // 1
  
Atomics.isLockFree(1); // true
  
Atomics.isLockFree(2); // true
  
Atomics.or(ta, 0, 1); // 12
  
Atomics.load(ta, 0);  // 13
  
Atomics.store(ta, 0, 12); // 12
  
Atomics.sub(ta, 0, 2); // 12
  
Atomics.load(ta, 0); // 10
  
Atomics.xor(ta, 0, 1); // 10
  
Atomics.load(ta, 0); // 11


输出:

933

示例 2:

Javascript

const buffer = new SharedArrayBuffer(2048);
  
const ta = new Uint8Array(buffer);
  
ta[0]; // 0
  
ta[0] = 5; // 5
  
Atomics.add(ta, 0, 12);   // 5
  
Atomics.load(ta, 0);      // 17
  
Atomics.and(ta, 0, 1); // 17
  
Atomics.load(ta, 0); // 1
  
Atomics.exchange(ta, 0, 12); // 1
  
Atomics.load(ta, 0); // 12
  
Atomics.compareExchange(ta, 0, 5, 12); // 1
  
Atomics.load(ta, 0); // 1
  
Atomics.isLockFree(1); // true
  
Atomics.isLockFree(2); // true
  
Atomics.or(ta, 0, 1); // 12
  
Atomics.load(ta, 0);  // 13
  
Atomics.store(ta, 0, 12); // 12
  
Atomics.sub(ta, 0, 2); // 12
  
Atomics.load(ta, 0); // 10
  
Atomics.xor(ta, 0, 1); // 10
  
Atomics.load(ta, 0); // 11

输出:

5
17
17
1
1
12
1
1
True
True
13
13
12
12
10
10