FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgMtMutualExclusion

目次→教本→プログラマーのための案内Mutual Exclusion←オリジナル・サイト

相互排除 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

Mutual Exclusion (相互排除) (ミューテックスの、作成、ロック/ロック解除、破棄)のミューテックスを処理する、組み込み手続き。

序文:
相互排除は、共有リソースへのアクセスを、直列にする方法です。
プログラマーが、スレッドが、別のスレッドによって既にアクセスされている、共有リソースにアクセスすることを望まない場合、ミューテックスを使うことができます。

論理的には、mutex は、キーが1つだけの鍵です:
- スレッドが、共有リソースにアクセスする場合、スレッドは、最初に鍵を取得する必要があります。
- スレッドが、いったん鍵を取得すると、他のスレッドは待機する必要があるため、他のスレッドが共有リソースにアクセスすることを心配せずに、共有リソースで必要な処理を実行できます。
- スレッドが、共有リソースの使用を終了すると、ミューテックスの鍵が解除され、他のスレッドが、共有リソースにアクセスできるようになります。

ミューテックスは、次の3つのことを保証する鍵です:
- 不可分性 - ミューテックスの鍵は不可分操作です。つまり、オペレーティング・システム(またはスレッド・ライブラリ)は、ミューテックスを施錠した場合、他のスレッドがこのミューテックスを同時に施錠できないことを保証します。
- 特異性 - スレッドがミューテックスを施錠できた場合、元のスレッドが開錠するまで、他のスレッドが、スレッドを施錠できないことが保証されます。
- 非ビジー待機 - スレッドが、2番目のスレッドによって施錠されたスレッドを施錠しようとすると、最初のスレッドは、2番目のスレッドによって開錠されるまで中断されます(CPUリソースを消費しません)。
開錠されると、最初のスレッドが目覚めて実行を継続します。この結果、ミューテックスはまた施錠されます。

これは、共有リソースへのアクセスを、直列化するプロトコルです。
このようなプロトコルは、保護されているリソース(暗黙のメイン・スレッドを含む)に触れる可能性のある、すべてのスレッドにわたって、mutex が保護しているリソースに、適用する必要があることに注意してください。

Mutex 機能は、切り離されたスレッドでも、完全に使用できます(そのハンドラーのみが、その識別子によってアクセスできなくなります)。

ミューテックスの 作成 / 破壊
MutexCreate は、ミューテックスを作成し、ミューテックスを破棄するときに参照されるハンドル識別子を返します。
MutexCreate で作成された mutex は、不要になったとき、または MutexDestroy でプログラムが終了する前に、破棄する必要があります。

作成
- 構文:
- 用法:
mutexid = MutexCreate
- 戻り値:
作成されたミューテックスの any ptr ハンドル (mutexid)、または、失敗した場合は、null ポインター (0) 。

破壊
- 構文:
- 用法:
MutexDestroy( mutexid )
- パラメータ:
mutexid
破棄するミューテックスの any ptr ハンドル。

説明
MutexCreate の呼び出しは、MutexCreate を使うスレッドを作成する前(および作成するスレッドで使うる前)に実行する必要があります。
MutexDestroy の呼び出しは、mutex を使うスレッドが使われなくなった後(および、mutex を破壊するスレッドで最後に使われた後)に実行する必要があります。

ミューテックスの施錠 / 開錠
MutexLock/MutexUnlock は、作成時に取得するハンドル識別子を参照して、ミューテックスを施錠/開錠できます。

Lock
- 構文:
- 用法:
MutexLock( mutexid )
- パラメータ:
mutexid
施錠するミューテックスの any ptr ハンドル。

Unlock
- 構文:
- 用法:
MutexUnlock( mutexid )
- パラメータ:
mutexid
開錠されるミューテックスの any ptr ハンドル。

説明
ミューテックスの施錠と開錠呼び出しの間のコードは、危険領域(critical section)と呼ばれます。
危険領域で費やされる時間を最小限に抑えると、他のスレッドが鍵を取得するために待つ時間を短縮できる可能性があるので、同時実行性が向上します。
したがって、できるだけ、スレッド・プログラマが、危険領域を最小化することが重要です。

擬似コードセクション
上記のすべての適切なルールを適用することにより:
'  Principle of mutual exclusion between 2 threads
'  (connecting lines join the sender(s) and receiver(s) impacted by each action occurring during the sequence)
'
'          Thread                                         Other Thread
'      MUTEXLOCK(mutexID) <----------------.    .---> MUTEXLOCK(mutexID)
'      Do_something_with_exclusion    .--- | ---'     Do_something_with_exclusion
'      MUTEXUNLOCK(mutexID) ----------'    '--------- MUTEXUNLOCK(mutexID)

先のページ (Threads) の最初の例は、各スレッドが単一の文字("M" か "C")を表示するのではなく、3文字(メインスレッドから "[M]" 、子スレッドの "(C)" )のシーケンスを表示するように変更されています。
各スレッドループのテンポは、スレッド間の表示を交互配置するために、3つの塊に分割されています。


参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2020-11-30 03:52:46
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承