Fair vs Nonfair

8

Ich habe faire und nicht faire Disziplinen über RentrantLock getestet. Ich habe ein kleines Programm geschrieben, das Dining-Philosophen simuliert.

Jeder Philospher hat links und rechts die Gabel, die ReentrantLock s sind. Ich habe 1000 mal Tat des Denkens und Essens simuliert:

%Vor%

wobei act

ist %Vor%

Think ist nicht interessant, es schläft nur für eine gewisse Zeit. Hier ist eat Methode

%Vor%

Hauptmethode:

%Vor%

Nachdem alle 5 Fäden fertig sind, drucke ich für jeden Philosophen eatCount. Und diese Werte unterscheiden sich nicht zu sehr für faire ( new ReentrantLock(true) ) und unfaire ( new ReentrantLock() ) Disziplin.

(erste Zahl ist eine Nummer eines Philosphers)

Fair lock:

%Vor%

Unfair Lock:

%Vor%

Ich habe etwas Hunger für unfaire Sperre erwartet, ich meine, einige Philosophen / Philosophen müssen essenCount viel größer als andere, aber Hunger hat nicht stattgefunden. Warum?

    
maks 17.12.2012, 17:09
quelle

3 Antworten

15

Der Thread, der eine Sperre freigibt, hat eine viel größere Chance, die Sperre wiederzuerlangen, während die anderen Threads blockiert sind. Belegtes Warten zeigt dies nicht, da jeder Thread die gleiche Chance hat, das Schloss zu greifen. Möglicherweise könnte derjenige, der das Schloss freigibt, einen leichten Nachteil haben.

%Vor%

druckt

%Vor%

Aber wenn ich die Sperre fair mache, sehe ich

%Vor%     
Peter Lawrey 17.12.2012, 17:32
quelle
1

Entfernen Sie alle sleep() , Sie können Ungerechtigkeit sehen.

    
irreputable 17.12.2012 17:27
quelle
0

@Maks, haben Sie versucht, zufällige Werte für EAT_TIME zu setzen?

Dies könnte der Logik einige Ungerechtigkeiten bringen.

    
Abbas Tolgay Yılmaz 30.11.2016 13:16
quelle

Tags und Links