Wechsel zwischen Threads (Sleep(0) oder SwitchToThread)



  • Hi,

    ich arbeite gerade an einer Programmanalyse, bei der mit mehreren Threads gearbeitet wird, innerhalb dieser Threads wird der Befehl Sleep(0) verwendet. Er soll angeblich dem Betriebssystem mitteilen, dass jetzt ein anderer Thread den Prozessor benutzen kann. Zu diesem Thema habe ich den Befehl SwitchToThread gefunden.

    Leider kann ich keinen richtigen Unterschied zwischen dem Sleep(0) und dem SwitchToThread finden, außer dass mir SwitchToThread eine Rückgabe liefert ob ein Thread den Prozessor benutzt hat.

    Hat sich jemand von Euch schon einmal damit beschäftigt?



  • Also wenn ich die Wahl hätte, dann würde ich mich für SwitchToThread(...) entscheiden. Ist doch viel eindeutiger, wenn man den Code liest. 😃



  • Ich sehe es genau so, aber da ich auf der suche nach Abstürzen in dem Programm bin (warscheinlich in einem WaitForSingleObjekt bei dem Zugriff auf einen kritischen Bereich (Mutex)), interessiere ich mich für die Abläufe im Betriebssystem (Windows 2k 😞 )



  • Für SwitchToThread muss _WIN32_WINNT mindestens mit 0x0400 definiert sein. Was soviel heisst, dass SwitchToThread erst seit WinNT 4 verfügbar ist. Wenn es dir also nichts ausmacht, auf Win95 Kompatibilität zu verzichten, dann solltest du imo SwitchToThread verwenden.



  • Wie wartest du denn auf das Mutex? Und wie genau sieht der Absturz aus? Ich hab auch schon öfter gedacht, dass das Warten bei mir einen Fehler hat, hab aber immer wieder andere banale Fehler gefunden, die das verursacht haben. 😃



  • In dem Programm wird mit Release(Mutex) und WaitForSingleObject(...) gearbeitet, das Programm arbeitet eine undefinierte Zeit stabiel und bleibt dann stehen. Wenn es im Debugger angehalten wird, liegen die Threads in einem WaitForSingleObject.

    Die Wartezeit ist im WaitForSingleObject beschränkt, allerdings bleibt das Programm strotzdem darin hängen, wie auch immer?



  • Zeig doch mal so eine Stelle. Was machst du sonst noch? Vielleicht schreiben auf einer R232-Schnittstelle oder so?

    [Edit]Ist übrigens klar, dass du mit WaitForSingleObject(...) usw arbeitest. Wir sind hier ja auch bei der WinApi. :D[/Edit]



  • Im geschützten Bereich wird nur auf Daten zugegriffen und nicht auf externe Geräte



  • Hmm, na gut, dann kann ich dir auch erstmal nicht helfen. Ich empfehle dir trotzdem andere eventuell kritische Sachen zu überprüfen, die vielleicht gar nichts damit zu tun haben.
    Bei mir war's einmal so, dass ich beim Öffnen einer R232-Schnittstelle nur eine kleine Einstellung gemacht habe, die das Gerät am anderen Ende aber nicht unterstützt hat. Hängen geblieben ist das Programm aber auf einem WaitForSingleObject. Du kannst dir sicherlich vorstellen, dass das eine Ewigkeit gedauert und mehr vom Zufall unterstützt war, bis ich den Fehler gefunden hatte. 😃



  • Also Sleep und SwitchToThread sind zwei unterschiedliche Dinge. Sleep(0) sagt dem betriebsyystem dass es den Rest der Zeitscheibe an einem anderen Thread abgegeben kann. ´Mot SwitchToThread schlatest du bewußt auf einen anderen Thread um, du musst ja das Handle eines Threads angeben. Du vergleichst also Äpfel mit Birnen, da beide Funktionen jeweils einen anderen Zweck haben.



  • Luckie schrieb:

    Sleep(0) sagt dem betriebsyystem dass es den Rest der Zeitscheibe an einem anderen Thread abgegeben kann. ´Mot SwitchToThread schlatest du bewußt auf einen anderen Thread um

    Und wo ist da der praktische Unterschied?

    Luckie schrieb:

    du musst ja das Handle eines Threads angeben

    Nö, musst du nicht.



  • groovemaster schrieb:

    Luckie schrieb:

    Sleep(0) sagt dem betriebsyystem dass es den Rest der Zeitscheibe an einem anderen Thread abgegeben kann. ´Mot SwitchToThread schlatest du bewußt auf einen anderen Thread um

    Und wo ist da der praktische Unterschied?

    Luckie schrieb:

    du musst ja das Handle eines Threads angeben

    Nö, musst du nicht.

    Stimmt, mein Fehler. Lies die Reamarks im PSDK, da steht der Unterschied.



  • Sleep(0) kann auch garnichts bewirken. SwitchToThread switched immer.



  • Luckie schrieb:

    Stimmt, mein Fehler. Lies die Reamarks im PSDK, da steht der Unterschied.

    Ich würde den aber lieber von dir hören. 😉

    WindowsKenner schrieb:

    Sleep(0) kann auch garnichts bewirken. SwitchToThread switched immer.

    Sehe ich nicht so.

    MSDN schrieb:

    If calling the SwitchToThread function causes the operating system to switch execution to another thread, the return value is nonzero.

    If there are no other threads ready to execute, the operating system does not switch execution to another thread, and the return value is zero.


Log in to reply