ページ 11

マルチスレッドについて②

Posted: 2013年5月23日(木) 04:01
by atori
再びマルチスレッドについてよくわからないところがあったので質問させていただきます。
2つの疑問点があります。

①スレッドは関数単位で動きますが、スレッドが終了した瞬間に、
 そのスレッドのスレッドハンドルは自動的にシグナル状態になるのでしょうか?

②WaitForSingleObject()は引数のハンドルがシグナル状態になるまで処理を待つ。というのはなんとなくわかるのですが、
 それはつまりこの関数を呼んでいるスレッドが止まるということなのでしょうか?
 そうだとしたら、その関数の動きが止まってしまいWaitForSingleObject()が動かなくなるということにはならないのでしょうか?

②の説明がしづらいです。自分は「スレッドは止まるが、引数のハンドルの状態は見ていてくれる」と解釈しています。
実際はどうなのか、よろしくお願いします。

Re: マルチスレッドについて②

Posted: 2013年5月23日(木) 11:03
by YuO
atori さんが書きました:①スレッドは関数単位で動きますが、スレッドが終了した瞬間に、
 そのスレッドのスレッドハンドルは自動的にシグナル状態になるのでしょうか?
正確には,スレッドオブジェクトがスレッド終了後にシグナル状態になります。
Terminating a Threadに,スレッド終了時に何が起きるかは書いてありますが,その順序までは書いてありません。
atori さんが書きました:②WaitForSingleObject()は引数のハンドルがシグナル状態になるまで処理を待つ。というのはなんとなくわかるのですが、
 それはつまりこの関数を呼んでいるスレッドが止まるということなのでしょうか?
 そうだとしたら、その関数の動きが止まってしまいWaitForSingleObject()が動かなくなるということにはならないのでしょうか?
WaitForSingleobjectを呼び出したスレッドは待機状態になります。
待機状態の解除条件は,ハンドルが示す先のオブジェクトがシグナル状態になることです。
また,監視を行うのはシステムですので,シグナル状態になった時点でスレッドは待機状態から解除されます。
# タイムアウトやオブジェクトの破棄という解除条件もあります。

WaitForSingleObjectを呼び出したスレッドが監視するわけではないので,ちゃんとWaitForSingleObjectから復帰します。

Re: マルチスレッドについて②

Posted: 2013年5月24日(金) 00:12
by atori
なるほど・・・
丁寧に説明していただきありがとうございました。

とてもわかり易かったです。
疑問が解消されたので、このトピックは閉じさせて頂きます