
排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。
と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。
No.5ベストアンサー
- 回答日時:
> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?
「一般論」と書いた意味を取り落とされているのではないかと思います。
「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。
なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)
ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。
ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。
ありがとうございます。
環境依存が(目的とする動作に影響)無く、両方とも
使用可能な場合は利便性を考えてどちらかを用いればよい、ということですね。
MutexとSemaphoreの環境についての差を考えずに質問したので、
皆さんに環境によって変わるので一概に言えないという
ご指摘を受けてしまいました。
用いる際は、環境に気をつけてどちらを使用するか
よく検討したいと思います。
No.4
- 回答日時:
詳細な定義はOSによって違ってくるので、一般論だけで話していても余り意味はありません。
セマフォだけしかない環境も、ミューテックスしかない環境も実在しますし。他の方と別の視点を与える意味で、ITRONのセマフォとミューテックスの違いを書くと、セマフォは複数ロックできるのに対して、ミューテックスは1つのロックだけというほかに、ミューテックスはデッドロックを回避するために優先度継承プロトコルが利用できるとか、ロック状態でタスクを終了した場合に自動的に解放されるといった違いがあります。ITRONのタスクはスレッドとほぼ同義で、プロセスの概念はありませんから、プロセス間/スレッド間といった相違はありません。
ありがとうございます。
どちらかしか使えないような状況もあるのですね。
ITRONが何かわからなかったので調べてみました。
このような環境もあるんですね。
参考になりました。
No.3
- 回答日時:
一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
しかし、Win32環境に限定すると、これ以上の違いがあります。
Win32では、Mutexに対するWaitとSemaphoreに対するWaitに次のような違いがあります。
Mutexは「どのスレッドに取得されたか」を認識していて、Mutexを取得しているスレッド内で同じMutexに対して再度Waitしてもブロックされません。
Semaphoreは「どのスレッドに取得されたか」を認識せず、Semaphoreを取得している同じスレッドで再度Waitすると、もう一度Semaphoreを取得しようとします。このとき、残りカウントが0だと(Semaphoreの定義により)他のスレッドでSemaphoreが開放されるまでブロックされます。
こういうスレッドに対する認識の違いがあるため「スレッド用」とか「プロセス用」とかの冠が付けられてしまう場合があるのだと思いますが、違いさえ認識していればどちらの用途に使っても全く差し支えありません。
この回答への補足
>一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
とのことですが、これはWin32以外の環境だと
これ以上の違いはないと言うことでしょうか?
だとするとmutexの存在意義がよくわからなくなってしまいます。
あるリソースをロックしたければセマフォのカウントを1に
して使えばよいだけのような。。?
No.2
- 回答日時:
ミユーテックが単一リソースの完全な排他を目的とするのに対し、セマフォは主に負荷調整を目的とする排他なのかなと思います。
例えば、OSの制限では1台のサーバに1万まで同時接続できるが、現実の性能としては100くらいが限界なので、セマフォを使って制限をかける。
個人的には、ミューテックはリストへの追加などでも使いますが、セマフォは使いどころがほとんど無いです。
ありがとうございます。
>ミユーテックが単一リソースの完全な排他を目的
>セマフォは主に負荷調整を目的
使用目的がわかりました。
セマフォはあまり使い道がないのですか。。
No.1
- 回答日時:
<ミューテックス>
同時に1プロセス(スレッド)しかリソースにアクセスできないようにするためのもの。
<セマフォ>
指定した数の範囲内で、同時に複数プロセス(スレッド)がリソースアクセスできる。
※ここでいうリソースとは、ファイルだったり、共有メモリだったり、場合によっていろいろです。
※どちらもプロセス間制御、スレッド間制御で利用できます。
この回答への補足
mutexもセマフォもスレッド、プロセス共に
制御できるとのことですが、自分が見た限りでは
mutexがプロセスの制御をできると言う資料がみつかりませんでした。
よろしければいい例のあるサイト等を教えて頂けないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 地理学 領海と排他的経済水域の違いについて。 上記2点の具体的な違いはなんでしょうか。 範囲が違うのは既に知 3 2023/01/20 19:24
- タブレット 子供のタブレットのペアレンタルコントロール 1 2023/04/14 14:34
- ビデオカード・サウンドカード 1つのマザボでAMD&NVIDIAを同時使用できますか? 3 2022/04/22 14:36
- 国産バイク 最低ABSさえちゃんとついていれば、その他のバイクの電子制御ってほとんどは、 ●色々な路面状況やバイ 2 2023/08/16 13:45
- デスクトップパソコン 光学ドライブのトレイが開かなくなりました 5 2023/05/25 13:53
- 環境学・エコロジー 二酸化炭素の排出 1 2023/08/07 16:40
- その他(悩み相談・人生相談) 性欲に個人差があるように食欲にも個人差があるのではないですか? 痩せている人は食欲を制御しているわけ 4 2022/08/07 10:53
- その他(住宅・住まい) 窓用換気扇の運用方法 2 2023/06/04 00:40
- 英語 関係代名詞「非制限用法」が説明する先行詞が無冠詞複数形の場合「一般的総称」と見なすことの可否について 10 2022/07/20 10:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プロセスの停止
-
タスクマネージャーのプロセス...
-
複数同時実行時の参照先について
-
共有メモリの使い方について
-
親子プロセス間でのデータの受...
-
リモートPCで動作しているプロ...
-
ShellExecuteExでハンドルの取得
-
プロセスのアタッチ・デタッチ...
-
CPU、 マザーボードについて
-
他のコンピュータのプロセスを取得
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
explorer.exeが異様にメモリを食う
-
他のEXEが起動しているかの確認
-
C言語 特定のプロセスの終了を...
-
タスクマネージャの「プロセス...
-
外部プロセスを終了したい!!
-
API関数 GetExitCodeProcess
-
バイナリ→構造体
-
他のアプリケーションの操作に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
プロセスIDの取得方法について
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
vb.netでEXCEL起動がうまくでき...
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
警告『 別のプロセスで使用され...
-
Visual C++からpingを実行して...
-
WSH.Runで待機できません
-
c言語でプロセスIDを調べたい
-
API関数 GetExitCodeProcess
おすすめ情報