Erklärung für Klassen in thread.h gesucht ...

  • Hallo,


    kann mir jemand mit verständlichen Wort die Bedeutung und Verwendung der folgenden Klassen erklären:


    class cCondWait
    class cCondVar
    class cRwLock
    class cMutex
    class cMutexLock
    class cThreadLock



    und als zweiter Teil wo ich sie anwende.


    Dazu habe ich ein Plugin mit einem Hintergrundthread (Hth) dieser greift auf eine Warteschlange (WS) zu und entnimmt dabei einen Wert aus der WS.


    Der Vodergrungthread (Vth) schreib neue Werte in die WS und kann sie auslesen. Während jedoch der Hth den Wert entnimmt soll der Vth maximal eine Sekunde auf die Freigabe der WS warten. Danach soll der Vth mit der Fehlerbehandlung fortfahren.


    Der Hth darf beliebig lange auf die Freigabe der WS warten. Dies passiert z.B. bei dem Auslesen der WS durch den Vth.


    Wie und Wo setzte ich dazu die o.G. Klassen ein?


    Hardy


    PS: gibt es eventl. eine fertige Warteschlage im Linux? Zurzeit nutze ich die cList des VDR's.

    Suche: 6 Richtige für die nächste Lottoziehung
    PS: Wer Rechtschreibfehler findet, darf sie behalten!

  • Ich versuchs mal:


    Zunächst die Klassen an sich...


    cMutex ist ein Mutual Exclusion Device. Er wird benutzt, um auszuschliessen, dass zwei Thread gleichzeitig etwa kritische Codestellen durchlaufen. Dazu kann ein cMutex gesperrt und entsperrt werden. Während ein Mutex gesperrt ist kann er keinesfalls nochmal gesperrt werden. Versucht ein zweiter Thread dies, muss er warten, bis der erste Thread die Sperre aufgehoben hat.



    cRwLock verhält sich im Prinzip ganz ähnlich, nur wird er verwendet, um geteilten und exclusiven Zugriff zu ermöglichen. Ein cRwLock kennt zwei Sperren: Eine Schreibsperre und eine Lesesperre. Während eine Schreibsperre aktiv ist, kann kein anderer Thread den cRwLock sperren (weder lesend noch schreibend). Ist jedoch nur eine Lesesperre verhängt, kann ein anderer Thread diesen cRwLock auch lesend, jedoch nicht schreibend sperren.


    Benutzen kann man das, wenn man eine Liste hat aus der beliebig oft (parallel) gelesen werden darf, in die jedoch nur geschrieben werden darf wenn _kein_ Lesevorgang mehr aktiv ist.


    Eine cCondVar ist eine sogenannte wartente Kondition. Ein Thread kann sie schlafen schicken, währenddessen ein anderer sie wieder wecken kann. Damit nun sichergestellt werden kann, dass ein Thread wirklich wartet, wenn ein anderer ihn wecken will, muss eine cCondVar im Zusammenspiel mit einem cMutex verwendet werden. Während die cCondVar nun wartet, entsperrt sie den (zuvor manuell gesperrten) Mutex. Dann weiss der weckende Thread (dadurch dass er die Sperre erhält), dass der andere Thread wirklich wartet. Der wartende Thread sperrt nach dem Wecken nun den Mutex wieder und wartet somit dass der weckende Thread die Sperre aufhebt.



    cCondWait ist eine Kapselung aus cCondVar und cMutex, mit dem Nachteil dass sich Schläfer und Wecker gegenseitig "verpassen" können. Für diesen Anwendungszweck nicht zu empfehlen.


    Die Klasse cMutexLock nun macht nichts weiter als einen ihr übergebenen cMutex zu sperren, bis die Lebenszeit des cMutexLock aufgebraucht ist.


    Code
    cMutex my_mutex;
    void Thread1(void) {
        cMutexLock lock(&my_mutex);
        ...
    } // <- die Zerstörung von "lock" bewirkt eine Entsperrung von "my_mutex"



    So, nun macht das Beispiel zu cCondVar wahrscheinlich schon _fast_, was Du möchtest. In diesem Fall könntest Du statt my_condvar.Wait(&my_mutex) my_condvar.TimedWait(&my_mutex, 1000) benutzen, dann würde Thread1 die Kontrolle in jedem Schleifendurchlauf an Thread2 abgeben, und zwar für maximal 1000 ms (oder bis Thread2 den ersten weckt).


    P.S.: Habe mich wirklich bemüht es verständlich zu machen, aber Threading ist stellenweise ein schwer verständliches Feld :]

  • Hallo LordJaxom,


    Zitat

    Original von LordJaxom
    P.S.: Habe mich wirklich bemüht es verständlich zu machen, aber Threading ist stellenweise ein schwer verständliches Feld :]


    Erstmal vielen Dank für Deine ausführliche Erklärung, ich denke es verstanden zu haben.


    Seit wann programmierst Du eigentlich, hast Du es richtig gelernt? Es fällt auf, daß Du auf viele meiner Programierfragen eine hilfreiche Antwort hast. ;D


    Hardy

    Suche: 6 Richtige für die nächste Lottoziehung
    PS: Wer Rechtschreibfehler findet, darf sie behalten!

  • Nunja, das meiste habe ich aus Erfahrung gelernt ;D


    Angefangen hab ich mit C schon auf dem Amiga (ca. 1992), damals mit einem hervorragenden Anfängerkurs in der AmigaDOS :D, dessen Autor mir auch einige Jahre lang ein guter Mentor war :]. Der Rest kam dann mit der Erfahrung, und wohl auch zu einem grossen Teil von meiner Neugier. Ich glaube es gibt nicht viele die bei Langeweile einfach mal fürs Üben kleine Frameworks schreiben oder Referenzen studieren :D. Ich will halt nicht nur wissen wie es funktioniert sondern auch stets wieso es so funktioniert...

  • Hi!


    Danke Sascha. Also das hat mich auch schon immer interessiert wofür man diese vielen Klassen brauchen könnte ... toll dass du das mal zusammengefasst hast ... das hilft mir sicherlich mal bei der ein oder anderen Problemstellung. :]


    Zitat

    Original von LordJaxom
    Klar gibts unter Linux auch echte Warteschlangen, allerdings nicht im Kontext der schönen VDR-Klassenhierarchie ;D


    Meinst du da die STL::queue? Oder wäre das was anderes wo man sich nicht um das Locken usw. kümmern müsste? Aber um das wird man ja wohl nicht herumkommen nehme ich an ...


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!