Solutions aux exercices du labo #8 (19 novembre 2015)
Transcription
Solutions aux exercices du labo #8 (19 novembre 2015)
Solutions aux exercices du labo #8 (19 novembre 2015) Solution à l’exercice 1. static private Lock mutex = new ReentrantLock (); static private Condition violonDisponible = mutex . newCondition (); static private Condition archetDisponible = mutex . newCondition (); public void run () { for ( int i = 1; i <= nbPieces ; i ++ ) { dormir (); // Il tente d’acquerir un violon. mutex . lock (); while ( violons . size () == 0 ) { try { violonDisponible . await (); } catch ( InterruptedException ie ) {}; } int numViolon = violons . iterator (). next (); violons . remove ( numViolon ); // Il tente d’acquerir un archet. while ( archets . size () == 0 ) { try { archetDisponible . await (); } catch ( InterruptedException ie ) {}; } int numArchet = archets . iterator (). next (); archets . remove ( numArchet ); mutex . unlock (); // Il a un violon et un archet , donc il joue. jouer ( i , numViolon , numArchet ); // Il a fini de jouer: il rend violon et archet. mutex . lock (); violons . add ( numViolon ); violonDisponible . signal (); archets . add ( numArchet ); archetDisponible . signal (); mutex . unlock (); } } Solution à l’exercice 2. a. RESULTAT_ATTENDU = 8. Calcule le N-ième nombre de Fibonacci. Plus efficace que l’algorithme récursif. Moins efficace, mais semblable à celui de programmation dynamique (avec un simple tableau) : les calculs sont lancés dans un ordre arbitraire, mais s’effectuent dans l’ordre habituel à cause des dépendances. b. public class IStructureMonitor <T > implements IStructure <T > { // Variables d’instance. private T [] elems ; private ReentrantLock [] verrous ; private Condition [] pleins ; @SuppressWarnings ( " unchecked " ) public IStructureMonitor ( int n ) { elems = ( T []) new Object [ n ]; verrous = ( ReentrantLock []) new ReentrantLock [ n ]; pleins = ( Condition []) new Condition [ n ]; for ( int i = 0; i < n ; i ++ ) { elems [ i ] = null ; verrous [ i ] = new ReentrantLock (); pleins [ i ] = verrous [ i ]. newCondition (); } } public void put ( int i , T v ) { verrous [ i ]. lock (); if ( elems [ i ] == null ) { elems [ i ] = v ; pleins [ i ]. signalAll (); } else { throw new AlreadyFullException (); } verrous [ i ]. unlock (); } public T get ( int i ) { verrous [ i ]. lock (); if ( elems [ i ] == null ) { try { pleins [ i ]. await (); } catch ( InterruptedException ie ) {} } verrous [ i ]. unlock (); return elems [ i ]; } }