tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
236
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    113
    Hallo,

    Ich schreibe gerade an einer eigenen string Klasse. Nun bin ich darauf gestoßen, dass diese gar nicht Threadsave ist und habe etwas herumgesucht um was dagegen zu tun. Habe schon einiges zu diesem Thema gefunden und bin auch auf eine eigene Idee gekommen.

    Würde es nicht reichen, eine klasseninterne (bool) Variable zu haben, die gesetzt wird, wenn eine Kritische Aktion durchgeführt wird.
    Ein andere Thread muss dann zum Beispiel bei diesem Abschnitt solange warten (while(flag)), bis der Kritischen Bereich wieder verlassen wird.

    Ist dies Threadsicher bzw. eine gute/schlechte Lösung und warum?
    Das Warten mit while() kommt mir nämlich etwas Brutal vor.
    Ist es besser mit EnterCriticalSection und LeaveCriticalSection zu arbeiten?

    mfg. posi90
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Zitat Zitat von posi90 Beitrag anzeigen
    Das Warten mit while() kommt mir nämlich etwas Brutal vor.
    Das ist es.
    Entweder, mit Sleep, verlangsamst du das Programm sehr,
    oder, ohne Sleep, hast du 100% CPU-Last.

    Zitat Zitat von posi90 Beitrag anzeigen
    Ist es besser mit EnterCriticalSection und LeaveCriticalSection zu arbeiten?
    Ja.
    posi90 bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    posi90 posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    113
    Danke für die rasche Rückmeldung und die Erklährung.

    mfg. posi90
     

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Hallo,

    deinen Vorschlag zur Synchronisation nennt man auch Spinlock. Wenn das Abfragen und setzen des Flags nicht atomar erfolgt, garantiert das aber nicht, dass nur ein Thread im kritischen Bereich ist:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    bool locked = false;
    int i = 0;
     
    void EnterCritical() {
      while (locked) {} // Auf Freigabe warten
      locked = true; // Kritischen Bereich belegen
    }
     
    void LeaveCritical() {
      locked = false; // Kritischen Bereich freigeben
    }
     
    void ThreadMain() {
      EnterCritical();
      // Kritischer Bereich
      LeaveCritical();
    }
    Angenommen die beiden Threads A und B wollen über einen Aufruf von EnterCritical den kritischen Bereich betreten. Wenn du Pech hast, verlässt A gerade die Schleife in Zeile 5 und wird vor der Ausführung von Zeile 6 vom Scheduler schlafen gelegt, um B auszuführen. B sieht dann, dass locked == false ist und betritt den kritischen Bereich. Sobald A wieder an der Reihe ist, betritt es ebenfalls den kritischen Bereich und schon hast du zwei Threads im kritischen Bereich.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. Eigene Thread Klasse
    Von thekiller im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 18.05.11, 17:57
  2. C# - Klasse DirectoryCopy incl. Thread & Status
    Von yooti im Forum .NET Café
    Antworten: 10
    Letzter Beitrag: 15.06.09, 23:04
  3. Antworten: 4
    Letzter Beitrag: 02.10.07, 14:35
  4. MFC und Thread - Probleme mit der Klasse CWinThread
    Von xthing im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 22.08.06, 18:27
  5. Antworten: 19
    Letzter Beitrag: 12.07.02, 11:13