Exercices

  1. Expliquez pourquoi la fonction sem_wait(3) doit prendre comme argument sem_t *, un pointeur vers une structure sem_t, et non une structure sem_t.

  2. Dans quels cas la fonction sem_init(3) risque-t-elle de retourner une erreur ?

  3. La librairie POSIX contient également une fonction sem_timedwait(3). Quel intérêt voyez-vous à cette fonction ? Dans quel cas pourrait-elle servir en pratique ?

  4. Un étudiant propose d’implémenter le producteur du problème des producteurs-consommateurs comme ci-dessous :

    // Producteur
    void producer(void)
    {
       int item;
       while(true)
       {
          item=produce(item);
          pthread_mutex_lock(&mutex);   // modification
          sem_wait(&empty);             // modification
          insert_item();
          pthread_mutex_unlock(&mutex);
          sem_post(&full);
       }
    }
    

    Que pensez-vous de cette solution (en supposant que le consommateur continue à fonctionner comme indiqué dans les notes) ?

  5. Un étudiant propose d’implémenter le consommateur du problème des producteurs-consommateurs comme ci-dessous :

    // Consommateur
    void consumer(void)
    {
      int item;
      while(true)
      {
          sem_wait(&full);
          pthread_mutex_lock(&mutex);
          item=remove(item);
          sem_post(&empty);             // modification
          pthread_mutex_unlock(&mutex); // modification
      }
    }
    

    Que pensez-vous de sa solution (en supposant que le producteur n’a pas été modifié) ?

  6. Un étudiant propose de résoudre le problème du rendez-vous en utilisant le code ci-dessous. Comparez sa solution avec la solution qui a été vue au cours.

    premiere_phase();
    
    pthread_mutex_lock(&mutex);
    count++;
    pthread_mutex_unlock(&mutex);   // modification
    if(count==N)
       sem_post(&rendezvous);
    
    sem_wait(&rendezvous);
    sem_post(&rendezvous);
    
    seconde_phase();
    
  7. Considérons un problème du rendez-vous avec 13 threads. Lorsque tous les threads ont passé le rendez-vous, quelle sera la valeur du sémaphore rendezvous retournée par la fonction sem_getvalue(3) ?

  8. La librairie POSIX contient la fonction sem_getvalue(3) qui permet de récupérer la valeur d’un sémaphore sans pour autant effectuer d’opération sem_wait(3) sur ce sémaphore. Elle peut être utilisée pour observer l’évolution de la valeur d’un sémaphore. Modifiez le programme des philosophes contenant un deadlock (/Programmes/src/pthread-philo-sem.c) et ajoutez-y un thread qui observe toutes les 10 secondes l’évolution des sémaphores et arrête tout le programme via exit(3) en affichant un message d’erreur si les valeurs des sémaphores n’ont pas changé.

  9. Les mutex et les sémaphores peuvent être utilisés pour résoudre des problèmes d’exclusion mutuelle. Le programme /QCM/S7/src/pthread-mutex-perf.c utilise des mutex. Modifiez-le pour utiliser des sémaphores à la place et comparez le coût en termes de performance entre les mutex et les sémaphores.

  10. Faites l’exercice sur les producteurs/consommateurs sur INGInious.

Verifiez vos réponses

Outils

  1. Si vous ne l’aviez pas fait durant la troisième semaine, prenez le temps pour faire l’exercice relatif à gdb(1) . Le debugger pourra vous être très utile pour le projet.
  2. Un autre outil particulièrement intéressant est Valgrind qui permet de détecter différents problèmes d’allocation de la mémoire. Prenez le temps nécessaire pour comprendre comment ce logiciel fonctionne, cette compétence vous fera gagner du temps plus tard et vous évitera de perdre du temps pour corriger un problème d’allocation de mémoire difficile à détecter.