• Aucun résultat trouvé

Concurrence producteur/consommateur

N/A
N/A
Protected

Academic year: 2022

Partager "Concurrence producteur/consommateur"

Copied!
11
0
0

Texte intégral

(1)

Concurrence

producteur/consommateur

Rémi Forax

(2)

Un serveur Web

Client 1

Client 2

Client 3

Client n

Thread 1

Thread 2

Thread 3

Thread m

?

Comment adapter les traitements si il y a plus de clients que de threads,

ou moins de client que de thread ?

(3)

Si aucun client ?

Client 1

Client 2

Client 3

Client n

Thread 1

Thread 2

Thread 3

Thread m

?

Les threads doivent être en attente !

(4)

Si trop de clients ?

Thread 1

Thread 2

Thread 3

Thread m

?

Les clients doivent être en attente

Client 1

Client 2

Client 3

Client n

(5)

Producteur / Consommateur

Design Pattern permettant

– D'arrêter un producteur si il n'y a pas de consommateur

– D'arrêter un consommateur si il n'y a pas de producteur

Astuce: on utilise un buffer intermédiaire

(6)

Producteur / Consommateur

Producteur 1

Producteur 2

buffer

Consommateur 1

Consommateur 2 mettre

mettre

prendre

prendre

On utilise un buffer intermédiaire,

une file (queue en anglais) dans laquelle

on va mettre des messages et prendre des message

Notez que la flèche est inversée !

(7)

Producteur / Consommateur

Producteur 1

Producteur 2

buffer

Consommateur 1

Consommateur 2 mettre

mettre

prendre

prendre

Si la file est vide,

– On met le consommateur en attente

Si la file est pleine,

– On met le producteur en attente

(8)

Implantation avec wait/notify

public class Buffer {

private final ArrayDeque<Message> buffer = new ArrayDeque<>();

private final int capacity;

public Buffer(int capacity) { this.capacity = capacity;

}

public void put(Message message) { synchronized(buffer) {

while(buffer.size() == capacity) { buffer.wait();

}

buffer.addLast(message);

...

} } ...

}

public Message take() { synchronized(buffer) {

while(buffer.size() == 0) { buffer.wait();

} ...

return buffer.removeFirst();

} }

On peut utiliser buffer comme moniteur !

(9)

Implantation avec wait/notify

public class Buffer {

private final ArrayDeque<Message> buffer = new ArrayDeque<>();

private final int capacity;

public Buffer(int capacity) { this.capacity = capacity;

}

public void put(Message message) throws IE{

synchronized(buffer) {

while(buffer.size() == capacity) { buffer.wait();

}

buffer.addLast(message);

buffer.notifyAll();

} } ...

}

public Message take() throws IE { synchronized(buffer) {

while(buffer.size() == 0) { buffer.wait();

}

buffer.notifyAll();

return buffer.removeFirst();

} }

(10)

Et avec des locks ?

public class Buffer {

private final ArrayDeque<Message> buffer = new ArrayDeque<>();

private final ReentrantLock lock = new ReentrantLock();

private final Condition isEmpty = lock.newCondition();

private final Condition isFull = lock.newCondition();

private final int capacity;

...

public void put(Message message) throws IE { lock.lock();

try {

while(buffer.size() == capacity) { isFull.await();

}

buffer.addLast(message);

isEmpty.signalAll();

} finally {

lock.unlock();

} } ...

}

public Message take() throws IE { lock.lock();

try {

while(buffer.size() == 0) { isEmpty.await();

}

isFull.signalAll();

return buffer.removeFirst();

} finally {

lock.unlock();

} }

(11)

j.u.c.BlockingQueue

Le buffer des producteurs/consommateurs est déjà implanté en Java

Il existe plusieurs implantations implantant l'interface BlockingQueue

LinkedBlockingQueue

Utilise une liste chainée (attention à fixer la taille)

ArrayBlockingQueue

Utilise un tableau circulaire (comme ArrayDeque)

SynchronousQueue

N'accepte qu'un seul élement -> debug

Références

Documents relatifs

dans la balise du paragraphe (méthode sans fichier css) pour changer la couleur du mot test en rouge… puis affecter la classe soustitrecolor à la balise. &lt;p&gt; en

I, Elda de Carvalho, as the coordinator of Moris Foun Group, which weave Tais in Uani Uma Village, declare that our group is surely ready that we agree to the government’s program and

[r]

[r]

Ecrire une fonction ´ int simul(int m) qui compare le nombre de couleurs utilis´ ees par l’algo exact et par DSATUR pour colorier m graphes al´ eatoires pour n et p fix´

a - Choisir des 7 mots de telle sorte qu'ils ontiennent tous les aratères aentués possibles. b - Erire une page HTML ontenant une ou deux phrases onstitués des

[r]

[r]