LabVIEW +
ソフト開発 +
実験・研究装置開発 +
システム開発 +
納入事例 +
会社概要 +
複数タスクからの一時的なアクセス制限、デッドロックの回避策をプロが徹底解説
LabVIEWはデータフロー言語であり、複数のループを同時に走らせる「並列処理」を極めて直感的に記述できます。しかし、複数の処理から同時に1つの計測器、ファイル、グローバル変数などの共通リソースへアクセス(競合)しようとすると、データの破損や不可解なバグ、クラッシュを招く原因になります。 これらを防ぐための強力な同期制御ツールが**「セマフォ(Semaphore)」**です。
セマフォはいわば**「リソースの利用許可証(トークン)」**です。「同時にアクセスできるタスクの数」をあらかじめ制限しておくことで、上限を超えたタスクを順番待ち(待機状態)にさせ、リソースの安全性を担保します。同時許可数が「1」のセマフォは、特に「バイナリセマフォ」や「ミューテックス(Mutex)」と同等の働きをします。
LabVIEWには他にも「キュー」や「通知器」といった同期関数があります。これらが「データの受け渡し(通信)」を主目的とするのに対し、セマフォは「特定の共有リソース(計測器やファイル)のロック・アクセス権の保護」を主目的に使用します。
LabVIEWでセマフォを実装する際は、関数パレットの「プログラミング > 同期 > セマフォ」にある関数を使い、以下の基本的な4ステップで構成します。
「セマフォ作成」関数を使用し、初期タスク数(同時にアクセスを許可する数)を設定します。通常、単一の計測器やリソースを1つのタスクだけで独占したい場合は、初期サイズを1に設定します。
1
共有リソースへアクセスする直前に、「セマフォ取得」関数を実行します。 もし利用枠が空いていれば即座に次の処理へ進めますが、既に他のタスクが取得中の場合は、枠が空くまでこの関数部分で処理が自動的に一時停止(待機)します。タイムアウト時間(ミリ秒)を設定することも可能です。
セマフォを取得したタスクだけが、安全にリソースへの処理(計測器へのコマンド送信、ファイル書き込みなど)を行います。他のタスクに割り込まれる心配はありません。
処理が完了したら、速やかに「セマフォ解放」関数を呼び出します。これにより、アクセス権の利用枠が1つ空き、順番待ちをしていた次のタスクが自動的に処理を再開できるようになります。
セマフォは非常に便利ですが、複数のセマフォを複雑に組み合わせると、タスクAがセマフォ1を取得したままセマフォ2の空きを待ち、同時にタスクBがセマフォ2を取得したままセマフォ1の空きを待つ、という「デッドロック(永久停止状態)」を引き起こすリスクがあります。
「複数の測定器をマルチスレッドで高速制御したい」「プログラムがたまに原因不明のフリーズを起こす」「レガシーなLabVIEWの構造を見直して自動化・効率化したい」といったご相談は、すべて測定代行株式会社にお任せください。
弊社は、元・横河電機のR&D出身エンジニアが代表を務めるLabVIEW受託開発のプロフェッショナル集団です。泥臭いハードウェア制御や通信ノイズ対策だけでなく、セマフォ、キュー、イベント構造、アクターフレームワークなどを駆使した、長期安定稼働する洗練されたソフトウェア設計・VI作成を得意としています。
元・横河電機のR&D出身者が直接設計する抜群の技術力
理研や産総研など、公的研究所や大学への豊富な納入実績
コンペ・申請用の相見積もり・指定書類作成も大歓迎
「他社が作ったプログラムの改修」「仕様書がない状態からの実験自動化」など、どんなお悩みでも大歓迎です。実務経験豊富なエンジニアが、親身にヒアリングを行って最適なシステムをご提案します。
お電話での受付:平日 9:00~18:00
048-291-8807