2009-06-17 15 views

答えて

13

私は思う - 元々 - この情報を提供する任意のAPIは誤解を招くと役に立たないので、この情報が提供されていませんでした。

現在のスレッドがスレッドの関心を中断している可能性が2つ考えられます。現在のスレッドのコードは、サスペンド状態に関するを知っており、共有できるため、カーネルチームがAPIを追加する必要はありません。

第2ケースは、いくつかの他の/システム内の第3スレッドは、対象のスレッドを中断(およびだったスレッドを追跡する方法theresのない)を有します。今度は競合状態になります。他のスレッドはいつでもスレッドの停止を解除でき、APIから集められた情報は役に立たなくなります。スレッドが実際に停止していることを示す値があります。

話の教訓 - あなたはスレッドが中断されていることを知りたい場合 - それを一時停止:SuspendThreadからの戻り値は、スレッドの前の一時停止カウントです。そして今、あなたは何か有用なことを知っています - スレッドは停止していますが、これは有効です。またはそれはされていませんでした(しかし今は)中断されました。いずれにせよ、スレッドの状態は確定的に知られているので、ResumeThreadにするか、中断したままにするかに基づいて理論的に選択できるようになります。

+1

Yep - スレッドサスペンド状態を照会しようとすると、本質的にレイシーになります –

+7

"サスペンド"と "実行中"を超えるスレッド状態があります。私は、OPがブロックされているスレッドを知ることに興味がある可能性が高いと思います。いずれにせよ、競争条件についてのあなたのポイントは良いものです。スレッドの状態を取得する方法がある場合は、情報目的でのみ使用する必要があります。制御フローのためにそれを使用しようとすると、怪我の世界につながるでしょう。 –

+0

完全に中断されているか中断されていないのは、通常は重要ではありません。実行中または待機中の同期信号....これは一般的に興味深いもので、パフォーマンスモニタなどのデバッガやツールが正確にこの情報を表示しているため、明らかに決定できるものです。さらに、適切に書かれたアプリケーションでは、スレッドはデバッガで実行されていない限り、決してサスペンドされません。 – Deltics

0

残念ながら、あなたはしません。あなたのコードに応じて、これを近似することができます(カーネルオブジェクトを待つときはいつでもフラグを設定します)が、OSやライブラリ呼び出しの中でスレッドが常にブロックされ、あなたはそれについて知りません。

1

Windows 7では、あなたはQueryUmsThreadInformationを使用することができます。 (UMSはユーザモードスケジューリングを表します)。

UmsThreadIsSuspendedためhere参照してください。

+2

クライアントの最小要件:Windows 7(64ビットのみ) –

+0

Windows 7以前のバージョンでは、SuspendThreadが既に中断されているスレッドに対して何を返すのだろうか。戻り値を一時的に中断/再開してチェックすることで、この方法で確認できます。ちょうどアイデアがうまくいかないかもしれません。 –

2

WMIのWin32_ThreadクラスにはThreadStateというプロパティがあります。ここでは5は「Suspended Blocked」、6はSuspended Readyです。

あなたは(WMIオブジェクトのHandleプロパティは、スレッドIDで)直接、右のインスタンスを取得するために、スレッドのIDが必要になります。

EDIT:このPowerShellのクエリを考える:

gwmi win32_thread | group ThreadState 

 
Count Name Group 
----- ---- ----- 
    6 2  {, , , ...} 
    966 5  {, , , ...} 

WMIは、Win32に "一時停止" の異なる定義を持っているを与えます。

1

あなたはスレッドが、このようなコードを数える中断を取得できます。すでに言ったように、

DWORD GetThreadSuspendCount(HANDLE hThread) { 
    DWORD dwSuspendCount = SuspendThread(hThread); 
    ResumeThread(hThread); 
    return dwSuspendCount; 
} 

しかし - それは正確ではありません。 さらに、スレッドを一時停止するのは悪いことです。

私は状態がここ

  • と呼ばれているスレッドがイベント

を待っている、スレッドprocの中でいくつかの処理を行っているか

  • 場合これは、使用しての世話をすることができると思い
  • +2

    スレッドを停止させて状態を取得するのは非常に良い考えです!スレッドが非常にビジー状態の場合、どのようなパフォーマンスが得られますか? – Elmue

    0

    スレッドが実際に実行しているか、イベントが発生するのを待っているかどうかを示す変数。

    これらのシナリオは、いくつかのn個のスレッドを持ち、各スレッドの実行状態に基づいて、アイドル状態のスレッドにタスクを割り当てることができるスレッドプールを検討するときに表示されます。

    3

    この情報は、NtQuerySystemInformation()をSystemProcessesAndThreadsInformation(整数値5)の値で呼び出して取得できます。

    この情報でできることの例をご希望の場合は、Thread Status Monitorをご覧ください。

    +0

    この回答は正しいですが、コードがありません。このAPIを使用するのは簡単ではありません。私はここに作業クラスを投稿しました:http://stackoverflow.com/questions/22949725/how-to-get-thread-state-eg-suspended-memory-cpu-usage-start-time-priori – Elmue

    2

    文書化されていませんが、IMHOである必要がありますが、WaitForSingleObjectを呼び出すと、スレッドが中断している場合はWAIT_ABANDONEDが返されます。さらに、スレッドが終了した場合、そのハンドルはシグナル状態になる。

    誰かがあなたの質問に答えなければならない理由を教えて、あなたの質問に答えてくれるのは、ほとんどのバグです...または質問WHYに質問し始めます。誰かがGoogleでこの質問を見つけた場合、理由はWHYと同じではないため、答えは他の誰にとっても役に立たないでしょう。

    +0

    ちょうどテストされ、そのようなものはありませんもの。実行モードとサスペンドモードの両方で 'WAIT_TIMEOUT'を返します。 – CodeAngry

    関連する問題