2009-06-17 14 views

Antwort

13

Ich denke - ursprünglich - diese Information wurde nicht zur Verfügung gestellt, weil jede API, die diese Informationen lieferte, irreführend und nutzlos wäre.

Betrachten Sie zwei mögliche Fälle - der aktuelle Thread hat den Thread-of-Interest deaktiviert. Code im aktuellen Thread kennt über den suspendierten Zustand und sollte in der Lage sein, es zu teilen, so dass es keine Notwendigkeit für das Kernel-Team gibt, eine API hinzuzufügen.

Der zweite Fall, einige andere/ein dritter Thread im System hat den Thread von Interesse ausgesetzt (und es gibt keine Möglichkeit zu verfolgen, welcher Thread war). Jetzt haben Sie eine Racebedingung - dieser andere Thread könnte zu jeder Zeit den Thread von Interesse entschlüsseln und die von der API gesammelten Informationen sind nutzlos - Sie haben einen Wert, der angibt, dass der Thread suspendiert ist, wenn er tatsächlich nicht ausgeführt wird.

Moral der Geschichte - wenn Sie wissen wollen, dass ein Thread ausgesetzt ist - suspend es: Der Rückgabewert von SuspendThread ist die vorherige Aussetzung des Threads. Und jetzt wissen Sie etwas Nützliches - Der Thread war und bleibt suspendiert - was nützlich ist. Oder dass es nicht war (aber jetzt ist) suspendiert. Wie auch immer, der Zustand des Threads ist nun deterministisch bekannt, so dass Sie theoretisch einige intelligente Entscheidungen treffen können, die auf diesem basieren - ob zu ResumeThread, oder ihn suspendiert halten.

+1

Ja - jeder Versuch, den Thread-Suspend-Status abzufragen, wird von Natur aus rassig sein –

+7

Es gibt Thread-Zustände jenseits von "suspended" und "running". Ich denke, es ist wahrscheinlicher, dass das OP daran interessiert ist zu wissen, welche Threads blockiert sind. In jedem Fall ist dein Standpunkt zu den Rennbedingungen ein guter. Wenn es einen Weg gibt, den Status eines Threads zu erhalten, sollte er nur zu Informationszwecken verwendet werden. Jeder Versuch, es für den Kontrollfluss zu benutzen, wird zu einer Welt voller Verletzungen führen. –

+0

Exakt - ausgesetzt oder nicht ausgesetzt ist in der Regel nicht von Interesse. Laufen oder warten auf ein Synchronisationssignal .... das ist in der Regel das, was von Interesse ist, und ist eindeutig etwas, das bestimmt werden kann, da Debugger und Tools wie Performance Monitor genau diese Informationen aufzeigen. Darüber hinaus werden Threads in einer ordnungsgemäß geschriebenen Anwendung * niemals * suspendiert, es sei denn, sie werden unter einem Debugger ausgeführt. – Deltics

0

Sie nicht, leider. Abhängig von Ihrem Code können Sie dies approximieren (indem Sie beispielsweise ein Flag setzen, wenn Sie beispielsweise auf ein Kernel-Objekt warten), aber bedenken Sie, dass ein Thread immer innerhalb eines Betriebssystem- oder Bibliotheksaufrufs blockieren kann und Sie nichts davon wissen würden.

1

In Windows 7 können Sie QueryUmsThreadInformation verwenden. (UMS steht für User Mode Scheduling).

Siehe here für UmsThreadIsSuspended.

+2

Minimale Client-Anforderung: Windows 7 (nur 64-Bit) –

+0

Für vor Windows 7 frage ich mich, was SuspendThread für einen bereits suspendierten Thread zurückgibt. Vielleicht können Sie dies überprüfen, indem Sie die Rückgabewerte vorübergehend anhalten/fortsetzen und überprüfen. Nur eine Idee, könnte nicht funktionieren. –

2

WMI's Win32_Thread Klasse hat eine ThreadState Eigenschaft, wo 5: "Suspended Blocked" und 6: Suspended Ready.

Sie benötigen die ID des Threads, um die richtige Instanz direkt zu erhalten (die Handle-Eigenschaft des WMI-Objekts ist die Thread-ID).

EDIT: Angesichts dieser Powershell-Abfrage:

gwmi win32_thread | group ThreadState 

gibt

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

WMI hat eine andere Definition von "Suspended" auf Win32.

1

Sie bekommen konnte Thread Suspend mit Code wie folgt zählen:

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

aber, wie schon gesagt - es ist nicht korrekt. Darüber hinaus ist das Aussetzen eines Threads böse.

+2

Eine sehr sehr schlechte Idee, einen Thread zu suspendieren, nur um seinen Zustand zu bekommen! Welche Leistung wird das haben, wenn der Thread sehr beschäftigt ist? – Elmue

0

Ich denke, die hier Staat bezeichnet wird, als

  • Wenn Thread im Thread proc, einige Verarbeitung zu tun Oder
  • für Ereignis Warten

Diese gepflegt werden kann durch die Verwendung Variable, die anzeigen kann, ob ein Thread tatsächlich ausgeführt wird oder auf das Ereignis wartet.

Diese Szenarien erscheinen, wenn man bedenkt threadpools, einige N Threads und auf jeder Fadenlaufzustand basierend aufweisen, können Aufgaben zugewiesen werden Fäden in den Leerlauf.

3

Sie können diese Informationen erhalten, indem NtQuerySystemInformation() mit dem Wert für SystemProcessesAndThreadsInformation (Integer-Wert 5) aufrufen.

Wenn Sie ein Beispiel dafür, was man mit diesen Informationen einen Blick auf Thread Status Monitor tun können.

+0

Diese Antwort ist richtig, aber der Code fehlt. Es ist nicht einfach, diese API zu verwenden. Ich postete hier eine Arbeiterklasse: http://stackoverflow.com/questions/22949725/how-to-get-thread-state-eg-suspended-memory-cpu-usage-start-time-priori – Elmue

2

Während es nicht dokumentiert ist - obwohl es meiner Meinung nach sein sollte, wenn Sie WaitForSingleObject rufen, wird es WAIT_ABANDONED zurück, wenn der Faden aufgehängt ist. Wenn ein Thread beendet wurde, befindet sich sein Handle in einem signalisierten Zustand.

Was mich am meisten ärgert ist, wenn jemand Ihre Fragen beantwortet, indem er Ihnen sagt, warum Sie keine Antwort auf Ihre Frage haben sollten ... Oder beginnt zu fragen WARUM Sie wollen es tun. Wenn jemand diese Frage auf Google findet, sind die Gründe für WARUM nicht die gleichen und somit würde sich die Antwort effektiv nutzlos für jemand anderen machen.

+0

Nur getestet und nicht so Ding. Es gibt 'WAIT_TIMEOUT' sowohl im laufenden als auch im suspendierten Modus zurück. – CodeAngry

Verwandte Themen