並列ループでローカル変数、グローバル変数、シェア変数を使用した際の競合状態に関して



使用ソフトウェア: LabVIEW Development Systems>>LabVIEW Full Development System
使用ソフトウェア・バージョン: 8.2
使用ソフトウェア・バージョンに特化:
二次のソフトウェア: N/A

問題:
独立した二つの並列ループを使用しています。一つめのループでデータ集録を行いローカル変数、グローバル変数、シェア変数に保存しています。 二つめのループでは定期的にデータをローカル変数、グローバル変数、シェア変数から読み取っています。多くの場合、うまく動作しますが時折データの損失、変数が空になっていることがあります。

解決策:
二つの並列ループを使用し、一つの変数へ書き込み、読み取りを行うと競合状態が発生する可能性があります。一つのループでローカル変数、グローバル変数、シェア変数から読み取り、もう一つのループからローカル変数、グローバル変数、シェア変数に書き込みを行う場合に起こります。読み取り、書き込みの同期が行われていない場合に実際に書き込まれる前に再度一つ前の値を読み取ってしまったり、読み取る前に書き込んでしまうことによります。

生産者 / 消費者ループのキューのデザインパターンはデータのオーバーフローや損失を防ぐのによく使われる方法です。生産者 / 消費者デザインパターンではキューにデータが存在している場合にのみ消費者ループが実行される同期が行われるのが利点です。

他の回避策としてはセマフォを用い、書き込む際に変数のリソースをロックする方法があります。



関連リンク:
KnowledgeBase DIRECT-3S8RDV: セマフォとは何ですか?
Developer Zone Tutorial: Application Design Patterns: Producer/Consumer
Developer Zone Tutorial: Local Variables, Global Variables, and Race Conditions

添付:

 






報告日時: 04/27/2001
最終更新日: 02/08/2010
ドキュメントID: 28Q6L7B5