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

更新日:2024/06/14

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

TypedArrayの指定位置の値が指定された値と等しいとき、Promiseオブジェクトをメンバーに持つオブジェクトを返します。

Promiseオブジェクトは、指定されたタイムアウト時間を経過するか、他のスレッドがAtomics.notify()を呼び出した時点で解決します。

似た機能を持つAtomics.wait()はスレッドをスリープしましたが、こちらは処理が続行します。
そのため、メインスレッドでも使用可能です。

 

■構文

Atomics.waitAsync ( typedArray, index, value, timeout )
  1. typedArray: 次のTypedArray

    対象:Int32ArrayBigInt64Array

  2. index: typedArrayのインデックス
  3. value: 比較する値
  4. timeout: Promiseオブジェクトが解決するまでの最大時間(ミリ秒)
次のプロパティを持つオブジェクト

  • async: 値がtrue のとき、valueプロパティにPromiseオブジェクトがセットされる
  • value: 次の文字列のいずれか、またはPromiseオブジェクト

    "not-equal": typedArrayの値とvalueが同値でない
    "timed-out": 引数timeoutが 0以下

※戻り値に含まれるPromiseオブジェクトは、"ok" または "timed-out" で解決します。

 

■使用例

以降のコードは、Node.jsを想定しています。

メインスレッド:

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

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

const i32Array = new Int32Array(buffer);

const obj 
    = Atomics.waitAsync( i32Array , 0 , 0 ,-10);

Promise.resolve( obj.value ) 
    .then( result =>{
        const v = Atomics.load( i32Array , 0 );
        console.log( `(main) ${result}:${v}` );
    });

Workerスレッド: worker.js

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

const i32Array = new Int32Array(buffer);

setTimeout(()=>{
    Atomics.store( i32Array , 0 , 100 );
      // Workerに合図を送る
    const result = Atomics.notify(i32Array, 0);
    console.log( `(Worker) ${result}個のスレッドが復帰`);
},1000);

次のような結果になります。

(main) ok:100
(Worker) 1個のスレッドが復帰

 

関連ページ

更新日:2024/06/14

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

スポンサーリンク

記事の内容について

null

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

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

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

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

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

 

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