next up previous contents
suivant: Producteurs/Consommateurs monter: wait, notify, notifyAll précédent: wait, notify, notifyAll   Table des matières

Sémaphore

Un sémaphore est un mécanisme classique permettant d'assurer une fomre d'exclusion mutuelle. Plus précisément, un sémpahore est une valeur entière $s$ associée à une file d'attente. On peut accéder au sémaphore par deux méthodes, la première $P$ attend que $s$ soit positif et décrémente $s$ (le processus est mis dans la file d'attente si $s$ n'est pas strictement positif), la deuxième $V$ incrémente $s$ ou libère une des processus attendant sur un $P$. Le problème de la section critique est très simple si l'on dispose de sémaphores. Les sémaphores peuvent aussi servir pour réaliser des buffer partagés entre des lecteurs et des écrivains.

Les sémaphores sont des primitives existant, par exemple, en UNIX système.

L'implémentation en Javs suit directement la définition précédente, la méthode $P$, fera un wait pur attendre que val soit positive, alors que la méthode $V$ incrémentera val et réveillera les processus en sommeil sur le wait par un notifyAll.

Le main suivant réalise une exclusion mutuelle très simple utilisant un sémaphore.



transparent
Sémaphore


import java.util.Random;
class Sem{
    int val;
    public Sem(int i){val=i;}
    synchronized void P(){
        try {
            while(val<=0){
                wait();
            }
            val--;
        } catch(InterruptedException e){}
    }
    synchronized void V(){
        if(++val > 0) notifyAll();
    }
}


transparent
Proc


class Proc extends Thread{
    Sem mutex;
    public Proc(String n, Sem s){
        super(n);
        mutex=s;
    }    
    public void run(){
        int p,sc; 
        Random rand = new Random();
        while (true){
            try {
        //  boucle principale ....


transparent
Proc suite


       // ...
                p=Math.abs(rand.nextInt()%5000); sleep(p);
                mutex.P();
                System.out.println(getName()+ " début de sc" );
                sc=Math.abs(rand.nextInt()%5000); sleep(p);
                System.out.println(getName()+ " fin de sc");
                mutex.V();
            } catch (InterruptedException e) {}
        }
    }
}
class Main{
    public static void main(String[] args) {
        Sem s= new Sem(1); new Proc("un",s).start();
        new Proc("deux",s).start();new Proc("trois",s).start();
     }
}



next up previous contents
suivant: Producteurs/Consommateurs monter: wait, notify, notifyAll précédent: wait, notify, notifyAll   Table des matières
Hugues Fauconnier 2002-01-11