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 ];
}
}

Documents pareils