[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