bloque(tâche) : endort la tâche désignéedort() : endort la tâche couranteréveille(tâche) : réveille la tâche désignéeattendre(e) : bloque la tâche courante si l'événement n'est pas signalésignaler(e) : débloque une tâche en attente sur l'événementclass Evenement {
private boolean signal = false;
private queue attente = new queue();
attendre() {
if(!signal)
dormir();
}
signaler() {
signal = true;
if(!attente.estVide())
reveiller(attente.defiler());
}
r_a_z() {
signal = false;
}
}
int i = 0;
Evenement e = new Evenement();
e.r_a_z();
RDV() {
i++;
if(i == n)
e.signaler();
else
e.attendre();
}
Pb: accès concurrent à i!
int i = 0;
Evenement e = new Evenement();
e.r_a_z();
mutex.init_semaphore(1);
RDV() {
mutex.acquire();
i++;
if(i == n)
mutex.release();
e.signaler();
else
mutex.release();
e.attendre();
}
class Condition {
private queue attente = new queue();
attendre() {
attente.enfiler(tâcheCourante);
dormir();
}
signaler() {
if(!attente.estVide())
reveiller(attente.defiler());
}
estVide() {
return attente.estVide();
}
}
class RDV() {
private int i;
private int n;
private Condition c = new Condition();
public RDV(int nbtâches) { //constructeur
i = 0;
n = nbtâches;
}
public synchronized void Arriver() {
i++;
if(i < n)
c.attendre();
else
c.signaler(); // Réveil en cascade
}
}