OVH Cloud OVH Cloud

Synchronisation de threads

3 réponses
Avatar
Wulfran
J'ai besoin pour un de mes programmes de synchroniser des threads (tous
identiques). D'apres ce que j'ai compris il faut utiliser les methodes
wait() et notifyAll() qui seraient equivalentes aux fonctions mutex en C
mutexLock et mutexUnlock (merci de me corriger si mon interpretation est
erronée).

N'ayant pu faire fonctionner mon programme j'ai voulu essayer l'exemple
(trivial à priori et pourtant...) suivant:

public synchronized void classementListe(){

try {
wait();
}
catch (InterruptedException e) {
}
System.out.println("test");
notifyAll();
}

La methode est declarée bien evidemment dans une classe heritant de
Thread , est appelée depuis run() et la methode start() est appelée
apres la creation de mes threads dans main().

A l'execution rien ne s'affiche, visiblement aucun des threads n'entre
dans la section critique. Si j'enleve la synchonisation j'obtient bien
autant d'affichages que de thread, ils sont donc bien initialisés.

Où est l'erreur ? A priori meme s'il ne rend jamais la main au moins un
des threads devrait entrer dans la section critique.

Merci de votre aide

3 réponses

Avatar
Laurent Bossavit
D'apres ce que j'ai compris il faut utiliser les methodes
wait() et notifyAll() qui seraient equivalentes aux fonctions mutex en C
mutexLock et mutexUnlock (merci de me corriger si mon interpretation est
erronée).


Non, wait() rend la main et met le thread en veille. Ce n'est pas une
sémantique d'acquisition de mutex. Celle-ci doit être programmée à un
niveau plus élevé en utilisant les primitives wait() et notify().

Laurent
http://bossavit.com/

Avatar
Emmanuel Bourg
Il faut que tes threads interagissent sur une ressource commune, si
chaque thread a sa propre méthode synchronized sur lui même ça ne v a pas
donner grand chose. Ici en l'occurrence le thread est endormis après
être entré dans sa méthode classementListe() et rien ne viendra le
réveiller, donc rien ne s'affiche.

Emmanuel


Wulfran wrote:

J'ai besoin pour un de mes programmes de synchroniser des threads (tous
identiques). D'apres ce que j'ai compris il faut utiliser les methodes
wait() et notifyAll() qui seraient equivalentes aux fonctions mutex en C
mutexLock et mutexUnlock (merci de me corriger si mon interpretation es t
erronée).

N'ayant pu faire fonctionner mon programme j'ai voulu essayer l'exemple
(trivial à priori et pourtant...) suivant:

public synchronized void classementListe(){

try {
wait();
}
catch (InterruptedException e) {
}
System.out.println("test");
notifyAll();
}

La methode est declarée bien evidemment dans une classe heritant de
Thread , est appelée depuis run() et la methode start() est appelée
apres la creation de mes threads dans main().

A l'execution rien ne s'affiche, visiblement aucun des threads n'entre
dans la section critique. Si j'enleve la synchonisation j'obtient bien
autant d'affichages que de thread, ils sont donc bien initialisés.

Où est l'erreur ? A priori meme s'il ne rend jamais la main au moins un
des threads devrait entrer dans la section critique.

Merci de votre aide



Avatar
Wulfran
Effectivement ça fonctionne beaucoup mieux sachant cela :)

Merci

Laurent Bossavit wrote:
D'apres ce que j'ai compris il faut utiliser les methodes
wait() et notifyAll() qui seraient equivalentes aux fonctions mutex en C
mutexLock et mutexUnlock (merci de me corriger si mon interpretation est
erronée).



Non, wait() rend la main et met le thread en veille. Ce n'est pas une
sémantique d'acquisition de mutex. Celle-ci doit être programmée à un
niveau plus élevé en utilisant les primitives wait() et notify().

Laurent
http://bossavit.com/