
排他制御としてセマフォと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で質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vb.netでEXCEL起動がうまくでき...
-
タスクマネージャーのプロセス...
-
OSPFでプロセスを分ける意義に...
-
IISがフリーズ
-
VB6.0 SHELLで起動...
-
ShellExecuteExでハンドルの取得
-
explorer.exeが異様にメモリを食う
-
プロセスのアタッチ・デタッチ...
-
Process.Startの戻り値を後で取得
-
Visual C++からpingを実行して...
-
バックグラウンドのプロセスの...
-
Linuxでのスレッド間メッセージ...
-
ADOでアクセスのレコードに...
-
GetModuleFileNameでエラーが出...
-
他のコンピュータのプロセスを取得
-
C#でのbatファイル実行結果取得
-
VBS(WSH)で開いたIEのウィンド...
-
バイナリ→構造体
-
シェルで親プロセス終了時に子...
-
popen について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
C#でのbatファイル実行結果取得
-
Process.Startの戻り値を後で取得
-
タスクマネージャーのプロセス...
-
SendMessageが失敗するときがある
-
VB6.0 SHELLで起動...
-
Linuxでのスレッド間メッセージ...
-
vb.netでEXCEL起動がうまくでき...
-
explorer.exeが異様にメモリを食う
-
プロセスIDの取得方法について
-
IISがフリーズ
-
jdbcのプロセスの処理について
-
c言語でプロセスIDを調べたい
-
セマフォとmutexの違いは?
-
警告『 別のプロセスで使用され...
-
ADOでアクセスのレコードに...
-
OSPFでプロセスを分ける意義に...
-
Windowsでのfork方法
おすすめ情報