[linux-l] Debian-Mirror der belug...

Jan-Benedict Glaw jbglaw at lug-owl.de
Fr Okt 17 15:09:52 CEST 2003


On Fri, 2003-10-17 14:20:06 +0200, Tobias Schlottke <toby at schlottke.net>
wrote in message <Pine.LNX.4.56.0310171415370.3502 at ws-toby.Netzwert.AG>:
> On Fri, 17 Oct 2003, Jan-Benedict Glaw wrote:
> > > public class MakeThreads extends Thread {
> > >     public static int maxThreads = 1000;
> > >     public static int started = maxThreads;
> > >
> > >     public void run() {
> > > 	started--;
> >         ^^^^^^^^^^
> > > 	while (true) {
> > > 	    try {
> > > 		sleep(5000);
> > > 	    } catch (Exception e){;}
> > > 	}
> > >     }
> > >     public static void main(String [] params) {
> > > 	long startTime = System.currentTimeMillis();
> > >
> > > 	for (int i=0;i<maxThreads;i++) {
> > > 	    new MakeThreads().start();
> > > 	}
> > > 	try {
> > > 	    while (started > 0) {
> >                    ^^^^^^^
> >
> > Ist das unter Java erlaubt? Funktioniert das auch? Unter C brauchst Du
> > dafür jedenfalls 'nen mutex...
> 
> Nö. Das macht doch der Prozessor in einem Zyklus.

Wie bitte? Java ist doch interpretiert, ja? Ich würde eher vermuten, daß
dafür so 100..5000 CPU cycles verbrannt werden.

Selbst, wenn das innerhalb zweier CPU-Befehle gemacht werden würde (ja,
selbst wenn Du ein decrement direkt auf einer Variable machen könntest)
kann das noch sauber danebengehen. Denk mal an ein nonCC-System...

CPU0 holt sich einen (den aktuellen) Wert, dekrementiert den, CPU1 holt
sich ebenfalls den Wert (ist bei ihr aber noch nicht sichtbar, erhält
also den alten Wert), -=1, schreibt zurück. Zweimal dekrementiert,
einmal kommt (vielleicht) an...

> Entweder der Int kommt vorher oder nachher. Zugegeben,

Oder mittendrin oder nie.

> ist nicht ganz sauber. Wenn der Compiler daraus mehr
> als eine Instruktion braucht, kann's scheppern. (Nein,
> _muß_ es scheppern ;-)

Falsch. Es scheppert schon, selbst, wenn es nur eine Instruktion ist.
Trenne Dich von dem Gedanken, daß, (C-isch) "*i = 5;" sofort und für
alle sichtbar den Speicher, auf den i zeigt, auf 5 setzt. Bestenfalls
sieht die CPU, die das getan hat, es sofort. Bei Intel sehen's auch andere
CPUs. Aber das stimmt nicht für viele andere Systeme...

Dort sorgt ein Lock dafür, daß andere CPUs erstmal ausgeschlossen
werden; beim Unlock wird dann der geänderte Speicht für alle sichtbar
gemacht, sodaß sie (nachdem der Unlock gelaufen ist) auch die aktuellen
Werte zur Verfügung haben.

MfG, JBG

-- 
   Jan-Benedict Glaw       jbglaw at lug-owl.de    . +49-172-7608481
   "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg
    fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!
   ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20031017/163cb1e9/attachment.sig>


Mehr Informationen über die Mailingliste linux-l