バイナリセマフォがリソースを原子的に保護できる場合、ミューテックスロックの利点は何ですか?
例えば、
sem_init(&sem, 0, 1);
sem_wait(&sem);
critical session;
sem_post(&sem);
セマフォに比べてミューテックスの利点を明確にしてください。
答え1
Robert Loveの「Linux Kernel Development」(第3版)によると、ミューテックスはセマフォよりも新しい発明ですが、「インターフェースがより簡単で、パフォーマンスがより効率的で、使用に関する追加の制限があります」(195ページ)。数が1のセマフォに似ていますが、セマフォのように高い数を得ることは不可能です。また、1つのタスクだけがミューテックスロックを保持でき、ロッカーはミューテックスロックのロック解除のみ(つまり他のコンテキストではロックを解除できません)、再帰ロックおよびロック解除は禁止され、ミューテックスロック保持中にプロセスを終了できません。プロセスはミューテックスロックを取得できません。割り込みハンドラまたは「サブハーフ」は公式APIを介してのみ管理できます。上記の制約違反を見つけるのに役立つデバッグモードもあります。
上記の制限のいずれかが問題にならない限り、デフォルトでミューテックスを使用することをお勧めします。特に、長いロック時間とロックが維持されている間スリープ状態にする必要がある項目にはミューテックスが優先されます。 (読む価値があるミューテックスとスピンロックに関する関連議論もあります。)
答え2
ミューテックスの場合、ミューテックスをロックしたスレッドのみがミューテックスのロックを解除できます。ただし、すべてのスレッドはセマフォを増減できます。