Unifinityでマルチスレッド

テックポエム

はじめに

Unifinity Ver.2.2.6にて「非同期処理実行」がロジックとして追加されました。
本機能の追加により、Unifnityでも念願のマルチスレッドプログラミングを行うことができます。

しかし、Unifintyには非同期実行された処理を制御するようなロジックが用意されておりません。。。
そこで今回は、Unifinityのロジックを組み合わせて排他制御を行う方法をご紹介したいと思います。

やりたいこと

  • 複数の処理が時間のかかる処理を実行後に処理結果をファイルに書き出す。
  • 実行順と書き込み順を揃えたい

とりあえず実行する

とりあえず何も手を加えずに処理を作って実行します。

非同期処理を起動する処理。
10個の処理を並行して実行させます。
img1.png

非同期で実行する処理
重い処理(今回はwaitで再現)を実行して、
共有リソースにデータ書き込み。
img2.png

実行結果
img3.png
赤枠の通り「起動順≠終了の記録順」となってしまっています。

対処する

案の定順番がバラバラになってしまいました。
実行順を制御できるように次のテーブル・処理を追加します。

管理用のテーブル

実行順を管理するためのテーブルを作成します。
img4.png

順番待ち開始処理

順番待ちの登録を行う処理です。
前述のテーブルにレコードを追加して順番待ちの登録を行います。
img5.png

順番待ち終了処理

排他制御を行うべき処理が終了したときに実行します。
順番待ちの登録を削除します。
img7.png

順番待ち処理

自分の実行順が回ってくるまで待機します。
自処理がシグナル状態となるまで処理を返しません。
img6.png

組み込む

実行順管理用の処理を組み込みます。
img8.png

以下のように実行開始時間順でデータが書き込まれるようになります。
img9.png

終わり

今回のサンプルはこちらからダウンロードができます。

非同期処理実行は使いこなせば非常に強力な機能です。

まだまだ足りない機能はございますが、ロジックの組み合わせで対処できることもございますので、皆様もぜひご活用ください。

以上。