Threads ohne "busy waiting" anhalten ?



  • moinmoin,
    ich hoffe, dass ich mit der thread-frage hier richtig bin...
    gibt es eine Möglichkeit einen Thread kurzzeitig anzuhalten? ICh bin gerade bei dem Problem geimeinsam genutzte Daten zwischen den Threads zu haben und will einen "kritischen Abschnitt" einfügen, was auch nicht das Problem darstellt. Wenn ein Thread auf Daten in einem kritischen Abschnitt zugreift, müssen die anderen Threads warten. Aber das verballert doch unmengen an rechenzeit! ("busy waiting" halt). In vielen Erklärungen über Threads wird das Problem angesprochen, aber nie ohne busy waiting gelöst.
    Auf der Suche in der MSDN bin ich nur auf Einträge gestoßen die beschreiben, wie man Threads ohne busy waiting anhalten kann(genau das was ich suche). Diese Beiträge beziehen sich aber leider nur auf C# und .NET
    Wie realisiere ich das unter C++? am besten wäre natürlich eine fertige WinAPI 😉
    heimschmiede



  • Normal nimmt man dafür eine CriticalSection! Und das hat im normalfall nix mit Busy-Waiting zu tun... ausser Du aktivierst den SpinCount...



  • Jochen Kalmbach schrieb:

    Normal nimmt man dafür eine CriticalSection! Und das hat im normalfall nix mit Busy-Waiting zu tun... ausser Du aktivierst den SpinCount...

    Ist das für dich eine Klasse? oder baust du dir die selber?
    denn, wenn ein ELement gelockt ist, weil ein anderer Thread gerade damit arbeitet, schreibt man eine leere while und wartet, bis das element wieder frei ist. aber windows gibt doch jedem thread seine rechenzeit und mein thread verballert die rechenzeit damit in einer while zu warten, während der andere thread die rechenzeit gut gebrauchen könnte um schneller arbeiten zu können.
    wenn ich den thread anhalten könnte, wäre die rechenzeit für einen zeitraum anderwertig zu vergeben, oder sehe ich das falsch?
    heimschmiede



  • Heimschmiede schrieb:

    Jochen Kalmbach schrieb:

    Normal nimmt man dafür eine CriticalSection! Und das hat im normalfall nix mit Busy-Waiting zu tun... ausser Du aktivierst den SpinCount...

    Ist das für dich eine Klasse? oder baust du dir die selber?
    denn, wenn ein ELement gelockt ist, weil ein anderer Thread gerade damit arbeitet, schreibt man eine leere while und wartet, bis das element wieder frei ist. aber windows gibt doch jedem thread seine rechenzeit und mein thread verballert die rechenzeit damit in einer while zu warten, während der andere thread die rechenzeit gut gebrauchen könnte um schneller arbeiten zu können.
    wenn ich den thread anhalten könnte, wäre die rechenzeit für einen zeitraum anderwertig zu vergeben, oder sehe ich das falsch?
    heimschmiede

    In einer while() schleife wartet man nicht. Nimm lieber, wie Jochen es gesagt hat eine CRITICAL_SECTION

    Siehe: http://www.codeproject.com/threads/Synchronization.asp

    BR



  • [quote="Heimschmiede"]

    Jochen Kalmbach schrieb:

    Normal nimmt man dafür eine CriticalSection! Und das hat im normalfall nix mit Busy-Waiting zu tun... ausser Du aktivierst den SpinCount...

    Ist das für dich eine Klasse? oder baust du dir die selber?

    Sowas kann nur durch das OS zur Verfügung gestellt werden! Sonst musst Du wirklich Busy-Waiting machen...
    Siehe: InitializeCriticalSection
    http://msdn.microsoft.com/library/en-us/dllproc/base/initializecriticalsection.asp
    (und noch Enter..., Leave..., Delete... )


Anmelden zum Antworten