またまたご質問させていただきます。
Win32APIのクリティカルセクションとミューテックスについてお伺いします。
複数のThreadが開放待ちの状態の時、次に処理が行える順番はどうなっているのでしょうか。
ThreadやProcessのプライオリティ順ですか?
開放されたタイミングで、取り合いをするのですか?
SynchronizeStartやWaitForSingleObjectが呼ばれた順番ですか?
クリティカルセクションとミューテックス、それぞれ教えて頂けますでしょうか。
色々調べてはみたのですが、2つのThreadでの例ばかりで、見つけることができませんでした。
プライオリティ順であることは確かだと思う。
でなかったらプライオリティの意味ないし。
でも実際どうなんだろうわかりません。
こうなるはずって言う期待をしてはいけません。
OSのバージョンアップとか改良で変わるから。
WaitForSingleObjectが呼ばれた順番は期待できない。
別スレッドでミューテックス待ちがあるのに
ミューテックス解放してその後すぐに獲得しにいけば
奪われずにミューテックス獲得に成功することもある。
これは正直困るけどそうなんだよ。
クリティカルセクションは知りません。
「ミューテックスは、開放されたタイミングで取り合いする」
なんとも嫌な感じですね。
他に情報をお持ちの方、いらっしゃいますでしょうか。
ご指導、お願い致します。
クリティカルセクションとミューテックスの両方で、サンプルアプリを作って試してみました。
Thread間の場合、SynchronizeStartが呼ばれた順番で処理がされました。
プライオリティに影響されることはありませんでした。
プロセス間の場合、プライオリティが同じ場合は、WaitForSingleObjectが呼ばれた順番に処理されました。
プライオリティ違う場合は、やはり高い方が占有してしまいます。
この解析結果は、OS依存、バージョン依存なのでしょうから、あてにはできないのでしょうね。
そもそも同一プライオリティー間での順番を気にすること自体が間違いで、そういう人はマルチスレッドプログラムがよく分かってない可能性が高いです。
それが分かった上でどうしても知りたいなら、InsideWindowsとか、以下のような話を調べる必要があるでしょう。
http://journal.mycom.co.jp/column/sopinion/219/index.html
でも実装を調べる(期待する)事自体が間違いなのは変わりないですが。
ツイート | ![]() |