Professional Documents
Culture Documents
(Σηματοφόροι / Σηματοφορείς)
Pi:
while (1) {
…
down(s); /* entry code */
do_critical_section();
up(s); /* exit code */
…
}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 60 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 61 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 62 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 63 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 64 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 65 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 66 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 67 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 68 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 69 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 2
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 70 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 2
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 71 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 2
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 72 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 2
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 73 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 2
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 74 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 75 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 76 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 1 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 77 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 1 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 78 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 79 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 1
sem s; s->mtx 0 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 80 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 0 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 81 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 0 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;} «χάνεται»!
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 82 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 1 {}
init(s,0); s->q 1 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 83 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 1 {}
init(s,0); s->q 0 {}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 84 lalis@inf.uth.gr
bup(&s->mtx);
Παράδειγμα Κατάσταση σημαφόρου
s->val = 0, s->qlen = 0
sem s; s->mtx 1 {}
init(s,0); s->q 0 {P0}
P0: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P1: bdown(&s->mtx);
down(s) if (s->val > 0) {s->val--; bup(&s->mxt);}
else {s->qlen++; bup(&s->mtx); bdown(&s->q);}
P2: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
bup(&s->mtx);
P3: bdown(&s->mtx);
up(s) if (s->qlen == 0) {s->val=1;}
else {s->qlen--; bup(&s->q);}
Προγραμματισμός ΙΙΙ 85 lalis@inf.uth.gr
bup(&s->mtx);
Το πρόβλημα
• Το πρόβλημα είναι ότι αίρεται ο αμοιβαίος
αποκλεισμός στην down πριν ένα νήμα προλάβει να
μπλοκάρει στην ουρά αναμονής q.
• Αυτό πρέπει αναγκαστικά να γίνει έτσι ώστε να
επιτρέψουμε σε κάποιο άλλο νήμα να εκτελέσει
κάποια στιγμή την up και να αφυπνίσει τα νήματα
που περιμένουν στην q.
• Έτσι όμως επιτρέπουμε και σε άλλα νήματα να
εκτελέσουν την down «μερικώς», και να αυξήσουν
την τιμή qlen χωρίς να υπάρχει ούτε ένα νήμα που
περιμένει στον σημαφόρο q.