JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptのAtomics.or()関数とは?使い方とサンプルコードを解説

JavaScriptのAtomicsオブジェクトは、SharedArrayBufferオブジェクトに対して安全に読み書きを行うためのアトミック(不可分)操作を提供する組み込みオブジェクトです。加算(add)、減算(sub)、AND(and)、OR(or)、XOR(xor)、読み込み(load)、書き込み(store)など、さまざまな操作が静的メソッドとして用意されています。

本記事では、その中でもAtomics.or()メソッドについて、基本的な構文から実際のコード例までわかりやすく解説します。

Atomics.or()とは

Atomics.or()は、配列内の指定した位置にある値に対してビット単位のOR演算を実行し、その結果を同じ位置に書き戻すメソッドです。戻り値としては、演算前にその位置に格納されていた古い値(元の値)が返されます。

この操作はアトミックに行われるため、複数のスレッド(ワーカー)が同じ共有メモリに同時にアクセスしても、データの競合や不整合が発生しません。

構文

Atomics.or(typedArray, index, value)

パラメータ

  • typedArray: SharedArrayBufferを基にしたInt8Array、Uint8Arrayなどの型付き配列。
  • index: OR演算を行う対象の配列内の位置(インデックス)。
  • value: ビット単位OR演算に使用する数値。

戻り値

指定した位置に格納されていた演算前の古い値が返されます。

使用例1:基本的な使い方

<html>
<head>
   <title>JavaScript Example</title>
</head>
<body>
   <script type="text/javascript">
      var arrayBuffer = new SharedArrayBuffer(16);
      var data = new Uint8Array(arrayBuffer);
      data[0] = 20;
      document.write(Atomics.or(data, 0, 30));
      document.write("<br>");
      document.write(Atomics.or(data, 0));
   </script>
</body>
</html>

実行結果

20
30

解説

最初にdata[0]に20を格納しています。Atomics.or(data, 0, 30)を実行すると、20と30のビット単位OR演算(20 | 30 = 30)が行われ、位置0には30が書き込まれます。このとき戻り値として返されるのは演算前の古い値「20」です。その後、Atomics.load()相当の読み出しにより、更新後の値「30」が確認できます。

使用例2:別の値での検証

<html>
<head>
   <title>JavaScript Example</title>
</head>
<body>
   <script type="text/javascript">
      var arrayBuffer = new SharedArrayBuffer(16);
      var data = new Uint8Array(arrayBuffer);
      data[0] = 2;
      document.write(Atomics.or(data, 0, 7));
      document.write("<br>");
      document.write(Atomics.or(data, 0));
   </script>
</body>
</html>

実行結果

2
7

解説

今度はdata[0]に2を格納しています。Atomics.or(data, 0, 7)を実行すると、2と7のビット単位OR演算(2 | 7 = 7)が行われ、位置0の値は7に更新されます。戻り値は演算前の古い値「2」となり、その後の読み出しで更新後の値「7」が得られます。

まとめ

  • Atomics.or()は指定位置の値に対してビット単位OR演算を行い、結果を書き戻す。
  • 戻り値は演算前の古い値である点に注意。
  • 操作はアトミックに実行されるため、マルチスレッド環境でも安全に利用できる。
  1. JavaScriptの関数プロトタイプとは?仕組みと使い方を解説

    JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに

  2. JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

    JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン