[C/C++] Thread sichere Klasse

posi90

Erfahrenes Mitglied
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
 
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:
C++:
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
 
Zurück