[linux-l] Debian-Mirror der belug...
Steffen Dettmer
steffen at dett.de
Mi Okt 22 13:07:48 CEST 2003
* Oliver Bandel wrote on Mon, Oct 20, 2003 at 17:55 +0200:
> On Mon, Oct 20, 2003 at 03:45:53PM +0200, Jan-Benedict Glaw wrote:
> > was ist, wenn Du (zusammenhängend) 10 Variablen verändern mußt?
> > Spätestens dann hast Du die race condition..
>
> Wieso?
> Erklär mal, was Du meinst.
ich versuchs mal.
unsigned int kasse = 1000;
unsigned int konto2 = 0;
Buchung: {
unsigned int value = 50;
if (kasse < value) {
kasse = kasse + getFromBank(value);
}
kasse = kasse - value;
konto2 = konto2 + value;
}
Der Code soll offensichtlich sicherstellen, daß kasse nie negativ
werden kann (erklär das sonst mal dem Finzanzamt, daß Du Geld aus
einer leeren Kasse nimmst :)).
Er ist nicht thread-safe! Wenn der Block Buchung von zwei Threads
ausgeführt wird, und kasse 51 enthält, kann folgendes passieren:
- Thread 1 prüft bedingung, erfüllt, weiter
- Threadswitch
- Thread 2 prüft bedingung, erfüllt, weiter
- Threadswitch
- Thread 1 bucht, kasse enthält 1
- Threadswitch
- Thread 2 bucht, kasse enthält 4294967247 (0xffffffcf)
- Gute Nacht und hallo Finanzamt :-) Macht fett Steuern auf gute
Kasseneinnahmen :-)
Richtig wäre also ein Lock um Buchung auf Kasse, selbst wenn alle
Kassenoperationen selbst atomar sind, ist das notwendig (sind sie
das nicht, kann kasse auch 0xffff0032 werden oder so - ein Thread
schreibt erst Hälft von 0, der andere schreibt erste Hälfte von
-49, der andere schreibt dann seine zweite hälfte "drüber").
oki,
Steffen
--
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.
Mehr Informationen über die Mailingliste linux-l