Baseline Widely available *
Atomics
å½å空é´å¯¹è±¡å
å«å¯¹ SharedArrayBuffer
å ArrayBuffer
对象æ§è¡ååæä½çéææ¹æ³ã
ä¸ä¸è¬çå
¨å±å¯¹è±¡ä¸åï¼Atomics
䏿¯æé 彿°ãå æ¤ä½ ä¸è½å°å
¶ä¸ new è¿ç®ç¬¦ä¸èµ·ä½¿ç¨æå° Atomics
对象ä½ä¸ºä¸ä¸ªå½æ°æ¥è¿è¡è°ç¨ãAtomics
çææå±æ§åæ¹æ³é½æ¯éæçï¼ä¸ Math
å¯¹è±¡ä¸æ ·ï¼ã
å½å åè¢«å ±äº«æ¶ï¼å¤ä¸ªç线ç¨è½å¤è¯»åå åä¸çå䏿°æ®ãååæä½ä¼ç¡®ä¿æ£å¨è¯»æåçæ°æ®ç弿¯ç¬¦å颿çï¼å³ä¸ä¸ä¸ªååæä½ä¸å®ä¼å¨ä¸ä¸ä¸ªååæä½ç»æåæä¼å¼å§ï¼å ¶æä½ä¸ä¼è¢«ä¸æã
çå¾ åéç¥wait()
å notify()
æ¹æ³éç¨çæ¯ Linux ä¸ç futex 模åï¼âå¿«éç¨æ·ç©ºé´äºæ¥ä½âï¼ï¼å¯ä»¥è®©è¿ç¨ä¸ç´çå¾
ç´å°æä¸ªç¹å®çæ¡ä»¶ä¸ºçï¼ä¸»è¦ç¨äºå®ç°é»å¡ã
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()
å°æå®ä½ç½®ä¸çæ°ç»å ç´ ä¸ç»å®çå¼ç¸å¼æï¼å¹¶è¿å弿æä½å该å ç´ çå¼ã
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);
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4