Atomics
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2021å¹´12æ.
* Some parts of this feature may have varying levels of support.
Atomics åå空éãªãã¸ã§ã¯ãã«ã¯ãä¸å¯åæä½ãå®è¡ããããã®éçã¡ã½ãããå«ã¾ãã¦ãã¾ããããã㯠SharedArrayBuffer ããã³ ArrayBuffer ãªãã¸ã§ã¯ãã§ä½¿ç¨ããã¾ãã
解説
ã»ã¨ãã©ã®ã°ãã¼ãã«ãªãã¸ã§ã¯ãã¨ã¯ç°ãªããAtomics ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ã§ã¯ããã¾ããã new æ¼ç®åã¨ä¸ç·ã«ä½¿ç¨ãããã Atomics ãªãã¸ã§ã¯ãã颿°ã¨ãã¦å¼ã³åºããããããã¨ã¯ã§ãã¾ããã Atomics ã®ãã¹ã¦ã®ããããã£ã¨ã¡ã½ããã¯éçã§ãï¼Math ãªãã¸ã§ã¯ãã®å ´åã¨åæ§ã§ãï¼ã
ä¸å¯åæä½
ã¡ã¢ãªãå ±æããã¦ããå ´åãè¤æ°ã®ã¹ã¬ãããã¡ã¢ãªã¼å ã®åããã¼ã¿ãèªã¿æ¸ãã§ãã¾ããä¸å¯åæä½ã§ã¯ãäºæ¸¬ãããå¤ã®æ¸ãè¾¼ã¿ã¨èªã¿è¾¼ã¿ãä¿è¨¼ãããããæ¬¡ã®æ¼ç®ãéå§ãããåã«ç¾å¨ã®æ¼ç®ãå®äºãããã®æ¼ç®ãå²ãè¾¼ã¾ããªãããã«ãã¾ãã
wait 㨠notify
wait() ã¡ã½ãã㨠notify() ã¡ã½ããã¯ã Linux ã® futex ("fast user-space mutex") ãååã¨ãã¦ãããç¹å®ã®æ¡ä»¶ã true ã«ãªãã¾ã§å¾
ã¤ææ®µãæä¾ãã¾ããä¸è¬çã«ã¯ããããã³ã°æ§é ã¨ãã¦ä½¿ç¨ããã¾ãã
éçããããã£
Atomics[Symbol.toStringTag]-
[Symbol.toStringTag]ããããã£ã®åæå¤ã¯æåå"Atomics"ã§ãããã®ããããã£ã¯Object.prototype.toString()ã§ä½¿ç¨ããã¾ãã
éçã¡ã½ãã
Atomics.add()-
é åã®æå®ããä½ç½®ã«ããæ¢åã®å¤ã«æå®ããå¤ã追å ãã¾ãããã®ä½ç½®ã«ãã£ãå¤ãå¤ãè¿ãã¾ãã
Atomics.and()-
é åã®æå®ããä½ç½®ã®å¤ã¨æå®ããå¤ã§ãããåä½ã®è«çç© (AND) ãè¨ç®ãã¾ãããã®ä½ç½®ã«ãã£ãå¤ãå¤ãè¿ãã¾ãã
Atomics.compareExchange()-
å¤ãçããå ´åãé åã®æå®ããä½ç½®ã«å¤ãæ ¼ç´ãã¾ããå¤ãå¤ãè¿ãã¾ãã
Atomics.exchange()-
é åã®æå®ããä½ç½®ã«å¤ãæ ¼ç´ãã¾ããå¤ãå¤ãè¿ãã¾ãã
Atomics.isLockFree()-
ããã¯æ©æ§ã¨ä¸å¯åæä½ã®ã©ã¡ãã使ç¨ããããæ±ºå®ããããã®æé©åããªããã£ãã§ããæå®ããè¦ç´ ãµã¤ãºã®é åä¸ã®ä¸å¯åæä½ã (ããã¯ã§ã¯ãªã) ãã¼ãã¦ã§ã¢ã«ããä¸å¯åæä½ã使ç¨ããããå®è£ ããã¦ããå ´åã
trueãè¿ãã¾ããä¸ç´è ã ãã使ç¨ãã¦ãã ããã Atomics.load()-
é åã®æå®ããä½ç½®ã®å¤ãè¿ãã¾ãã
Atomics.notify()-
é åã®æå®ããä½ç½®ã§å¾ æ©ä¸ã®ã¨ã¼ã¸ã§ã³ãã«éç¥ãã¾ããéç¥ãåããã¨ã¼ã¸ã§ã³ãã®æ°ãè¿ãã¾ãã
Atomics.or()-
é åã®æå®ããä½ç½®ã®å¤ã¨æå®ããå¤ã§ãããåä½ã®è«çå (OR) ãè¨ç®ãã¾ãããã®ä½ç½®ã«ãã£ãå¤ãå¤ãè¿ãã¾ãã
Atomics.pause()-
å¼ã³åºãå´ãå ±æãªã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹ãå¾ æ©ãã¦ããéãCPU ã«ãã®ãã¨ãç¥ããããã¤ã¯ãã¦ã§ã¤ãããªããã£ããæä¾ãã¾ããããã«ãããã·ã¹ãã ã¯ãç¾å¨ã®ã¹ã¬ãããè²ããã¨ãªããã³ã¢ï¼é»åãªã©ï¼ã¾ãã¯ã¹ã¬ããã«å²ãå½ã¦ããã¦ãããªã½ã¼ã¹ã縮å°ãããã¨ãã§ãã¾ãã
Atomics.store()-
é åã®æå®ããä½ç½®ã«æå®ããå¤ãæ ¼ç´ãã¾ãããã®å¤ãè¿ãã¾ãã
Atomics.sub()-
é åã®æå®ããä½ç½®ã®å¤ããæå®ããå¤ãæ¸ç®ãã¾ãããã®ä½ç½®ã«ãã£ãå¤ãå¤ãè¿ãã¾ãã
Atomics.wait()-
é åã®æå®ä½ç½®ã«æå®ããå¤ãå«ã¾ãã¦ãããæ¤è¨¼ãã伿¢ãã¦å¾ æ©ãããã¿ã¤ã ã¢ã¦ããã¾ãã
"ok"ã"not-equal"ã"timed-out"ã®ããããã®æååãè¿ãã¾ããå¼ã³åºãå ã®ã¨ã¼ã¸ã§ã³ãã§å¾ æ©ã許å¯ããã¦ããªãå ´åãä¾å¤ãçºçãã¾ããï¼ã»ã¨ãã©ã®ãã©ã¦ã¶ã¼ã§ã¯ããã©ã¦ã¶ã¼ã®ã¡ã¤ã³ã¹ã¬ããã§wait()ã許å¯ãã¦ãã¾ãããï¼ Atomics.waitAsync()-
å ±æã¡ã¢ãªã¼ä¸ã®å ´æãéåæçã«ï¼ã¤ã¾ãã
Atomics.waitã¨ã¯ç°ãªãããããã¯ããã«ï¼å¾ æ©ããæä½ã®çµæã表ããªãã¸ã§ã¯ããè¿ãã¾ãã Atomics.xor()-
é åã®æå®ããä½ç½®ã®å¤ã¨æå®ããå¤ã§ãããåä½ã®æä»çè«çå (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 ã§ Atomics.notify() ãå¼ã³åºãã¾ã§ãåä½ãã¾ããã
ãã ãã復帰å¾ã«ãæ¸ãè¾¼ã¿ã¹ã¬ããã«ãã£ã¦ä½ç½® 0 ã®å¤ã夿´ããã¦ããªãå ´åãèªã¿åãã¹ã¬ããã¯ä¼ç ç¶æ
ã«æ»ãããå¦çãç¶ãã¾ãã
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);
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-atomics-object> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
ArrayBuffer- JavaScript åä»ãé å
- ã¦ã§ãã¯ã¼ã«ã¼
- Shared Memory â çããã¥ã¼ããªã¢ã« (TC39 ecmascript-sharedmem proposal)
- A Taste of JavaScript's New Parallel Primitives (hacks.mozilla.org, 2016)