バイナリ セマフォとミューテックスには違いがありますか、それとも本質的に同じですか?
ベストアンサー1
これらは同じものではありません
。異なる目的で使用されます。どちらのタイプのセマフォも満杯/空の状態を持ち、同じ API を使用しますが、使用方法は非常に異なります。
相互排他セマフォ
相互排他セマフォは、共有リソース (データ構造、ファイルなど) を保護するために使用されます。
Mutex セマフォは、それを取得するタスクによって「所有」されます。タスク B がタスク A によって現在保持されている mutex を semGive しようとすると、タスク B の呼び出しはエラーを返して失敗します。
ミューテックスは常に次のシーケンスを使用します。
- セムテイク - クリティカルセクション - セムギブ
以下に簡単な例を示します。
スレッドA スレッドB ミューテックスを取る データにアクセス ... Mutex を取得 <== ブロックします ... Mutexアクセスデータを与える <== ブロック解除 ... ミューテックスを与える
バイナリ セマフォ
バイナリ セマフォはまったく異なる質問に対処します。
- タスク B は、何かが起こるのを待って保留されます (たとえば、センサーが作動する)。
- センサーがトリップし、割り込みサービス ルーチンが実行されます。トリップをタスクに通知する必要があります。
- タスク B が実行され、センサーのトリップに対して適切なアクションが実行されます。その後、待機状態に戻ります。
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
バイナリ セマフォでは、B がセマフォを取得し、A がセマフォを渡すことは問題ありません。繰り返し
ますが、バイナリ セマフォはリソースをアクセスから保護するものではありません。セマフォの譲渡と取得は基本的に分離されています。
通常、同じタスクが同じバイナリ セマフォに対して譲渡と取得の両方を呼び出すことはあまり意味がありません。