【JSリファレンス】Atomics.add()

更新日:2024/06/14

Atomics.add()は、Atomicsオブジェクトのメソッドです。

TypedArrayの指定された位置から値を取り出し、指定された値を加算後、元の位置にセットします。最後に、加算前の値を返します。

この一連の処理は、別スレッドからの割込みがおこらないように制御されます。

 

■構文

Atomics.add ( typedArray, index, value )
  1. typedArray: 対象となる整数型のTypedArray

    対象:Int8ArrayUint8ArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayBigInt64ArrayBigUint64Array

  2. index: typedArrayのインデックス
  3. value: 加算する値
加算前の値

 

■使用例

const u16 = new Uint16Array([1,2,3]);

console.log( Atomics.load(u16,0) );
// 結果: 1

console.log( Atomics.add(u16,0,10) );
// 結果: 1

console.log( Atomics.load(u16,0) );
// 結果: 11

▶メイン/Workerスレッド間での不可分操作

以降のコードは、Node.jsを想定しています。
実行結果は実行環境により異なります。

メインスレッド:

const {Worker} = require("worker_threads");

const buffer = new SharedArrayBuffer(
    Int32Array.BYTES_PER_ELEMENT*2);
new Worker("worker.js", { workerData:buffer });

const i32Array = new Int32Array(buffer);

setTimeout(()=>{
      // Workerに合図を送る
    Atomics.notify(i32Array, 1, 1);
    for(let i = 0;i < 500 ;i++){
        const before = Atomics.add( i32Array , 0 , 3 );
        const after = Atomics.load(i32Array,0);
        console.log( `main:${before} => ${after}` );
    }
},1000);

Workerスレッド:worker.js

const {workerData:buffer} = require("worker_threads");

const i32Array = new Int32Array(buffer);

  // メインの開始合図まで停止する
Atomics.wait(i32Array,1,0);

for(let i = 0;i < 500 ;i++){
    const before = Atomics.add( i32Array , 0 , 3 );
    const after = Atomics.load(i32Array,0);
    console.log( `worker:${before} => ${after}` );
}

 

関連ページ

更新日:2024/06/14

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。