dポイントプレゼントキャンペーン実施中!

WindowAPI スレッドのステータスの取得

SleepやWaitForSingleObject/WaitForMultipleObjectsの関数を呼び出し
スレッドをsleep状態にしたとします(スレッドA)。

その他のスレッドからスレッドAがSleep状態か
どうかを確認することはできるでしょうか?

A 回答 (2件)

念のため、前回の回答への補足です。



> こちらでも直前・直後にフラグをON/OFFさせる方法を試してみたのですが、
多分そうだろうなと思ってました。

> Unlock直後からSleepに入る際のわずかな期間に
> どうしてもフラグと実際のステートの齟齬が出てしまうため
> それを当てにすることはできないようでした。
スレッド制御において、齟齬のでない状態の管理というは不可能です。
もしそれが可能であるとすると、ミューテックスのような制御機構そのものが不要になりますので。

> やはり外部のスレッドの状態がどうであるかを気にしなくても済むようにプログラムする
> のが一番手っ取り早い方法のようです。
手っ取り早いと言いますか、それが本来の正しいやり方だと思います。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2010/09/21 12:34

自分も興味を持ったので、少し調べてみましたが、難しいですね。


とりあえず、それらしいAPIを見つけられませんでした。

ただ、通常の1つのミューテックスなどで、処理を制御するケースでは、
他のスレッドの状態を知る必要のあるケースが想像つきませんでした。
どのような条件下で、他のスレッドの状態を知る必要が生じるのかを
簡単で良いので書いて頂くと回答し易いかも知れません。
(ただ、明快な回答をできるか解りませんが…。)


また、1つ擬似的な方法として、下記を記しますが、良い方法か悪い方法か解りません。

スレッド、t1,t2,…,tn に対して、
状態、s1,s2,…,sn を用意しておいて、
制御オブジェクト(ミューテックスなど)m1,m2,…,mnを用意します。

スレッドtkでのスリープ処理で、
mk.lock
sk = スリープ状態
mk.unlock
Sleep
mk.lock
sk = 非スリープ状態
mk.unlock
のように処理します。

他には、スレッドtkでのクリティカルな処理で、同様に、
mk.lock
sk = 状態の変更
mk.unlock

// クリティカルな処理

mk.lock
sk = 状態の変更
mk.unlock
のようにします。

他のスレッドから、スレッドtkの状態を知るには、
mk.lock
skの参照
sk.unlock
のようにします。

これで一応状態の管理はできるとは思います。
#役にたつかどうか解りませんが…。(変な回答ですいません。)
    • good
    • 0
この回答へのお礼

こちらでも直前・直後にフラグをON/OFFさせる方法を試してみたのですが、
Unlock直後からSleepに入る際のわずかな期間に
どうしてもフラグと実際のステートの齟齬が出てしまうため
それを当てにすることはできないようでした。

やはり外部のスレッドの状態がどうであるかを気にしなくても済むようにプログラムするのが
一番手っ取り早い方法のようです。

どうもありがとうございました。

お礼日時:2010/08/29 12:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!