AtomicsがES2017のstage4にJSの世界にマルチスレッド・共有メモリ・排他制御の仕組みが備わることになった。Javascript/Browserにおけるマルチスレッド・並列実行Javascriptの世界では長らく協調的スレッドと呼ばれるような仕組みで擬似的に並列実行を行っていた。いわゆるノンプリエンプティブなスレッドである。100);})();これはタイマーを利用した再帰処理だが、ブラウザがスケジューリングしたタイミングでそれぞれloop1とloop2が処理を行う。各処理に割り込みが入ることはない。endの順番で出力される。startとはならない。Concurrent.ThreadConcurrent.Threadという古のライブラリがある。3);こうすると1hello2hello3hello1world2world3worldというまさにプリエンプションが行われたかのような結果となる。再スケジューリングすることでコンテキストスイッチを実現している。メインスレッド上で分割して実行しているため、あくまで、並列であり並行ではない。Workerというものがある。これはまさに前述の並行処理を可能にするもので、本物のスレッドである。各スレッド間はメッセージングでやりとりを行い、JSONのやり取りしかできない。処理は並列だが、各スレッドが共有する値にアクセスすることはできない。このWokerの仕組みを採用した事により排他制御の複雑さからは逃れられている。BuffersSharedArrayBufferはWebWorker間で値を共有できない問題を解決するために導入された、Worker間をまたいだバイト配列共有の仕組みである。SharedArrayBufferをスレッド間で共有すると問題が発生する。//Aこの場合Aの値は1かも知れないし、2かもしれない。1か2のどちらかになるだろう。2といったような順序で処理が行われている場合、AのsharedArrayBufferはまだ初期化されていない可能性がある。いうようにスレッドの可視性の問題によって、また、CPU・コンパイラによる各種最適化によってAスレッドで更新された値がBスレッドから確実に読めるかという疑問はかなり不確定な答えになってしまう。Atomicsこれを解決するのがAtomicsである。0));この場合、sharedArrayBuffer間の値の読み書きの順序は整合性を持つことになる。説明としてはこんぐらい。基本的にスレッド間の変数の整合性・一貫性を保つのがAtomicsの役割。numberアトミックにtypedArrayのindexから値を取得する。numberアトミックにtypedArrayのindexにvalueを書きこみその値を返す。numberアトミックにtypedArrayのindexの値からvalueを引きその結果を返す。numbertypedArrayのindexがwakeされるか、timeoutまでsleepする。mainスレッドでは呼び出せない。int32Arrayの0番目の値が0の場合スリープし続ける。voidcount個のwait中のtypedArrayのindexをwakeする。1つのwaitしているSharedArrayBufferのsleepを解除する。SharedArrayBuffer指定されたtypedArrayの指定されたindexにvalueを設定する。op)を使い、Atomicに値をロード、変更、storeする。SharedArrayBuffer指定されたtypedArrayの指定されたindexの値と指定されたvalueの論理積とり、指定されたindexに設定する。op)を使い、Atomicに値をロード、変更、storeする。numbertypedArrayのindexの値をexpectedValueと比較し、等しければreplacementValueを書き込む。戻り値は更新前のtypedArrayのindexの値。numbertypedArrayのindexにvalueを書き込み、以前のindexの値を返す。boolean指定されたサイズがロックフリーオペレーションが可能かを返す。まとめWebWorkerでShareArrayBufferを使う場合は常にAtomics経由でアクセスしたほうが良い。しなくても良いパターンもあるが、Atomicオペレーションのコストより安全側に倒したい。2はてなブログをはじめよう!brn_takeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。