<< 前へ        次へ >>

ID : 5034

Mutexオブジェクト

Mutexオブジェクトとはタスク間の排他制御に使用するオブジェクトです。

Mutexオブジェクトは状態を"Locked"と"Unlocked"の2つ持っています。初期値は"Unlocked"状態です。"Unlocked"状態から"Locked"状態にするにはどのタスクからも可能です。しかし、"Locked"状態から"Unlocked"状態にできるのは"Locked"状態にしたタスクのみです。

"TakeMutex"ステートメントはMutexオブジェクトを"Unlocked"状態から"Locked"状態にします。指定したMutexオブジェクトが他のタスクから"Locked"状態になっている場合は"Unlocked"状態になるまで待ちます。この機能でタスクを排他処理します。

排他処理の流れ

1 Mutexオブジェクトの作成

Mutexオブジェクトを作成するにはCreateMutexを実行します。Mutexオブジェクトの名称を指定します。このときすでに他のタスクから同じ名称のMutexオブジェクトが作成されている場合はMutexオブジェクトは新規に作成されず、既存のオブジェクトIDを返し、オブジェクトにはタスクの参照が登録されます。

Mutexオブジェクトはプロジェクト内に複数作成することができ、名称とIDで識別します。同時に最大64個のMutexオブジェクトを作成することができます。同じ名称で作成してもIDは都度違うIDが発行されます。

名称はMutexオブジェクト作成時(CreateMutex実行時)にオブジェクトの識別としてユーザが任意に命名することができます。名称は255Byte以内の文字列型データで命名でき、識別の判定は文字列の比較で判定されますので、大文字/小文字や空白なども全て一致しなければ別のオブジェクトとして認識されます。

2 排他処理

各タスクの排他処理したい処理(プログラムコード)を"TakeMutex"と"GiveMutex"で囲みます。はじめに"TakeMutex"が実行されたタスクのみ処理を実行できますが、他のタスクはMutexオブジェクトが"Locked"状態なので"TakeMutex"の実行でMutexオブジェクトが"Unlocked"になるまで待ちます。

はじめにMutexオブジェクトを"Locked"状態にしたタスクが"GiveMutex"を実行するとMutexオブジェクトは"Unlocked"状態になり、待っていた他のタスクの"TakeMutex"が実行されます。

3 Mutexオブジェクトの消失

タスクが排他処理を終了したい場合は"DeleteMutex"を実行し、Mutexオブジェクトの消去をシステムに要求します。Mutexオブジェクトは他の参照がなければ消失します。また、タスクが終了した時は自動的にMutexオブジェクトの消去を要求します。

Mutexオブジェクトに参照を登録されているタスクが全てなくなったときにMutexオブジェクトは消失します。

Mutexオブジェクトに消失要求(DeleteMutex)できるのはそのMutexオブジェクトをCreateMutexした(参照が登録された)タスクのみです。

Mutexオブジェクトの状態

Mutexオブジェクトにはエラー状態を表すプロパティがあります。

"Locked"状態にしたタスクが"Locked"状態のまま止まってしまったり、タスクが消失してしまったときなどは、Mutexオブジェクトはエラー状態となり、同時に"Unlock"状態、エラーのタスクは参照を消失します。

次に他のタスクがエラー状態のMutexオブジェクトを"Locked"状態にしようとする(TakeMutex)とタスクがエラーとなります。エラー処理ルーチンで"ResetMutex"を実行しMutexオブジェクトのエラー状態を解除してください。"排他処理のプログラム例3"参照。

排他処理のプログラム例

排他処理のプログラム例1
一般的なタスク間の排他処理の例です。Pro1-> Pro2-> Pro3が順に実行されます。
排他処理のプログラム例2
Mutexオブジェクトの生存期間を意識したタスク間の排他処理例です。Pro1-> Pro2-> Pro3が順に実行されます。Mutexオブジェクトの生存期間はPro1に依存します。
排他処理のプログラム例3
エラーによって排他処理が中断された場合の対処例です。Pro1-> Pro2が順に実行され、常に I1,I2,I3が連番になるように排他します。エラーが起った場合は復帰処理によって不整合な状態に対処しています。

ID : 5034

<< 前へ        次へ >>