-
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
-
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, ...?
-
Danke für die rasche Rückmeldung und die Erklährung.
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:
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.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(); }
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
-
Eigene Thread Klasse
Von thekiller im Forum C/C++Antworten: 3Letzter Beitrag: 18.05.11, 17:57 -
C# - Klasse DirectoryCopy incl. Thread & Status
Von yooti im Forum .NET CaféAntworten: 10Letzter Beitrag: 15.06.09, 23:04 -
Gui Komponent an Thread(andere Klasse) übergeben
Von HuRaHoRRe im Forum JavaAntworten: 4Letzter Beitrag: 02.10.07, 14:35 -
MFC und Thread - Probleme mit der Klasse CWinThread
Von xthing im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 22.08.06, 18:27 -
max - c4d (Thread split by IKEAFREAX on 09.07.2002 23:43 (thread by pasq))
Von pasq im Forum 3D Studio MaxAntworten: 19Letzter Beitrag: 12.07.02, 11:13



1Danke

Zitieren



Login






