Atomics
åºçº¿
广æ³å¯ç¨
*
èª 2021å¹´12æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Atomics å½å空é´å¯¹è±¡å
å«å¯¹ SharedArrayBuffer å ArrayBuffer 对象æ§è¡ååæä½çéææ¹æ³ã
æè¿°
ä¸ä¸è¬çå
¨å±å¯¹è±¡ä¸åï¼Atomics 䏿¯æé 彿°ãå æ¤ä½ ä¸è½å°å
¶ä¸ new è¿ç®ç¬¦ä¸èµ·ä½¿ç¨æå° Atomics 对象ä½ä¸ºä¸ä¸ªå½æ°æ¥è¿è¡è°ç¨ãAtomics çææå±æ§åæ¹æ³é½æ¯éæçï¼ä¸ Math å¯¹è±¡ä¸æ ·ï¼ã
ååæä½
å½å åè¢«å ±äº«æ¶ï¼å¤ä¸ªç线ç¨è½å¤è¯»åå åä¸çå䏿°æ®ãååæä½ä¼ç¡®ä¿æ£å¨è¯»æåçæ°æ®ç弿¯ç¬¦å颿çï¼å³ä¸ä¸ä¸ªååæä½ä¸å®ä¼å¨ä¸ä¸ä¸ªååæä½ç»æåæä¼å¼å§ï¼å ¶æä½ä¸ä¼è¢«ä¸æã
çå¾ åéç¥
wait() å notify() æ¹æ³éç¨çæ¯ Linux ä¸ç futex 模åï¼âå¿«éç¨æ·ç©ºé´äºæ¥ä½âï¼ï¼å¯ä»¥è®©è¿ç¨ä¸ç´çå¾
ç´å°æä¸ªç¹å®çæ¡ä»¶ä¸ºçï¼ä¸»è¦ç¨äºå®ç°é»å¡ã
éæå±æ§
Atomics[Symbol.toStringTag]-
[Symbol.toStringTag]屿§çåå§å¼æ¯å符串"Atomics"ãè¿ä¸ªå±æ§å¨Object.prototype.toString()ä¸ä½¿ç¨ã
éææ¹æ³
Atomics.add()-
å°ç»å®çå¼ä¸æ°ç»ä¸æå®ä½ç½®çå ç´ ç¸å ï¼å¹¶è¿åç¸å å该å ç´ çå¼ã
Atomics.and()-
å°æå®ä½ç½®ä¸çæ°ç»å ç´ ä¸ç»å®çå¼ç¸ä¸ï¼å¹¶è¿å䏿ä½å该å ç´ çå¼ã
Atomics.compareExchange()-
妿æ°ç»ä¸æå®çå ç´ ä¸ç»å®çå¼ç¸çï¼åå°å ¶æ´æ°ä¸ºæ°çå¼ï¼å¹¶è¿å该å ç´ åå çå¼ã
Atomics.exchange()-
å°æ°ç»ä¸æå®çå ç´ æ´æ°ä¸ºç»å®çå¼ï¼å¹¶è¿å该å ç´ æ´æ°åçå¼ã
Atomics.isLockFree()-
ä¸ä¸ªä¼ååè¯ï¼å¯ç¨äºç¡®å®æ¯ä½¿ç¨éè¿æ¯ååæä½ã妿ç»å®å ç´ å¤§å°çæ°ç»ä¸çååæä½å°ä½¿ç¨ç¡¬ä»¶ååæä½æ¥å®ç°ï¼è䏿¯éï¼ï¼åè¿å
trueãä» ä¾ä¸å®¶ä½¿ç¨ã Atomics.load()-
è¿åæ°ç»ä¸æå®å ç´ çå¼ã
Atomics.notify()-
éç¥æ£å¨çå¾ æ°ç»æå®ç´¢å¼ç代çãè¿åæ¶å°éç¥çä»£çæ°éã
Atomics.or()-
å°æå®ä½ç½®ä¸çæ°ç»å ç´ ä¸ç»å®çå¼ç¸æï¼å¹¶è¿åææä½å该å ç´ çå¼ã
Atomics.store()-
å°å¼å¨åå°æ°ç»çæå®ä½ç½®ï¼å¹¶è¿å该å¼ã
Atomics.sub()-
å°æå®ä½ç½®ä¸çæ°ç»å ç´ ä¸ç»å®çå¼ç¸åï¼å¹¶è¿åç¸åå该å ç´ çå¼ã
Atomics.wait()-
æ£æµæ°ç»ä¸æä¸ªæå®ä½ç½®ä¸ç弿¯å¦ä»ç¶æ¯ç»å®å¼ï¼æ¯åä¿ææèµ·ç´å°è¢«å¤éæè¶ æ¶ãè¿åå¼ä¸º
"ok"ã"not-equal"æ"time-out"ãè°ç¨æ¶ï¼å¦æå½å代çä¸å 许é»å¡ï¼å伿åºå¼å¸¸ï¼å¤§å¤æ°æµè§å¨é½ä¸å 许å¨ä¸»çº¿ç¨ä¸è°ç¨wait()ï¼ã Atomics.waitAsync()-
å¨å ±äº«å åä½ç½®ä¸å¼æ¥çå¾ ï¼å³æ²¡æé»å¡ï¼ä¸
Atomics.waitä¸åï¼å¹¶è¿åä¸ä¸ªPromiseã Atomics.xor()-
å°æå®ä½ç½®ä¸çæ°ç»å ç´ ä¸ç»å®çå¼ç¸å¼æï¼å¹¶è¿å弿æä½å该å ç´ çå¼ã
示ä¾
>ä½¿ç¨ Atomics
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);
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.compareExchange(ta, 0, 5, 12); // 1
Atomics.load(ta, 0); // 1
Atomics.exchange(ta, 0, 12); // 1
Atomics.load(ta, 0); // 12
Atomics.isLockFree(1); // true
Atomics.isLockFree(2); // true
Atomics.isLockFree(3); // false
Atomics.isLockFree(4); // 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
çå¾ åéç¥
ç»å®ä¸ä¸ªå
±äº«ç Int32Arrayï¼
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
妿ä½ç½® 0 ä¸çå¼ä¸º 0ï¼å读å线ç¨å°ä¿æä¼ç ä¸ä»£ç ä¸ä¼ç»§ç»æ§è¡ã使¯ï¼ä¸æ¦åå ¥çº¿ç¨å¨åäºä¸ä¸ªæ°çå¼ï¼ååå ¥çº¿ç¨å°éç¥å®å¹¶è¿åæ°çå¼ï¼123ï¼ã
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-object> |
æµè§å¨å ¼å®¹æ§
åè§
ArrayBuffer- JavaScript ç±»ååæ°ç»
- Web Worker
- Shared Memoryââä¸ä¸ªç®ççæç¨ï¼å¨ TC39 ecmascript-sharedmem ææ¡ä¸
- JavaScript æ°å¹¶è¡è¯æ³çåä½éª å¨ hacks.mozilla.org ä¸ï¼2016ï¼