Programmation Multithread

Dimension: px
Commencer à balayer dès la page:

Download "Programmation Multithread"

Transcription

1 Programmation Multithread Partie 3 Professeur : Bruno De Kelper Département Génie Électrique Synchronisation Les Threads partagent les ressources Besoin de synchroniser pour: - Garder la cohérence des données partagées (ex: un compteur est incrémenté par chacun des Threads.) - Garder la cohérence d un fichier susceptible d être modifié par différents Threads. - Assurer la séquence d exécution quand c est requis (ex: remplir un record de données avant de le lire) Programmation Multithread 2

2 Synchronisation Objets de synchronisation: - Ce sont des variables qui résident normalement dans la mémoire partagée - Les objets de synchronisation sont: - Mutex - variables de condition - sémaphore Programmation Multithread 3 Exclusion mutuelle (Mutex( Mutex) Mutex est utilisé pour s assurer qu un seul Thread exécute la section critique du code à la fois Pour ceci, un Thread doit réserver le Mutex avant d exécuter la section de code Libérer le Mutex pour permettre aux autres Threads de le réserver. Programmation Multithread 4

3 Attribut d un d Mutex Portée d un Mutex Int pthread_mutexattr_setpshared(pthread_mutex attr_t *mattr, int pshared); pshared peut être une des 2 valeurs suivantes: - PTHREAD_PROCESS_PRIVATE: Mutex privé à un processus - PTHREAD_PROCESS_SHARED: Mutex partagé avec d autres processus Programmation Multithread 5 Initialiser un Mutex Pour définir et initialiser un Mutex de façon statique: pthread_mutex_t mp= PTHREAD_MUTEX_INITIALIZER; Pour initialiser dynamiquement: pthread_mutex_t mp; pthread_mutexattr_t mattr; int pthread_mutex_init (&mp, NULL); int pthread_mutex_init (&mp, &mattr); Programmation Multithread 6

4 Réservation du Mutex Syntaxe: int pthread_mutex_lock (pthread_mutex_t *mutex); Si le Thread qui exécute pthread_mutex_lock ne peut pas réserver le Mutex, il se met en mode sleep (attente) Programmation Multithread 7 Réservation sans attente Syntaxe: int pthread_mutex_trylock (pthread_mutex_t *mutex); Cette fonction retourne - 0: réservation réussie, - EBUSY: le Mutex est déjà réservé par un autre Thread Programmation Multithread 8

5 Libération du Mutex Syntaxe: int pthread_mutex_unlock (pthread_mutex_t *mutex); Libération doit toujours se faire après réservation du Mutex Programmation Multithread 9 Utilisation de plusieurs Mutex Si les Threads ne réservent pas ces Mutex dans le MÊME ORDRE, un dead-lock peut arriver Exemple: Programmation Multithread 10

6 Utilisation de plusieurs Mutex Pour éviter le dead-lock: - les Threads doivent réserver les Mutex dans le même ordre - ils les libèrent dans l ORDRE INVERSE de l ordre de réservation Exemple: Programmation Multithread 11 Variables de condition Une variable de condition est toujours associée à un Mutex Elle est testée sous la protection du Mutex Programmation Multithread 12

7 Variables de condition pthread_cond_wait (condition,mutex) pthread_cond_signal (condition) pthread_cond_broadcast (condition) Programmation Multithread 13 Variables de condition Syntaxe: int pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr); Attente de variable de condition: - int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex); - int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, timestruct_t timespec *abstime); Programmation Multithread 14

8 Signaler une condition But: réveiller les Threads qui attend une variable de condition Pour réveiller le premier Thread qui attend la variable de condition: - int pthread_cond_signal (pthread_cond_t *cond); Pour réveiller tous les Threads qui attendent sur une variable de condition: - int pthread_cond_broadcast (pthread_cond_t *cond); Programmation Multithread 15 Signaler une condition pthread_cond_wait() blocks the calling thread until the specified condition is signalled. This routine should be called while mutex is locked, and it will automatically release the mutex while it waits. After signal is received and thread is awakened, mutex will be automatically locked for use by the thread. The programmer is then responsible for unlocking mutex when the thread is finished with it. The pthread_cond_signal() routine is used to signal (or wake up) another thread which is waiting on the condition variable. It should be called after mutex is locked, and must unlock mutex in order for pthread_cond_wait() routine to complete. The pthread_cond_broadcast() routine should be used instead of pthread_cond_signal() if more than one thread is in a blocking wait state. It is a logical error to call pthread_cond_signal() before calling pthread_cond_wait(). Proper locking and unlocking of the associated mutex variable is essential when using these routines. For example: Failing to lock the mutex before calling pthread_cond_wait() may cause it NOT to block. Failing to unlock the mutex after calling pthread_cond_signal() may not allow a matching pthread_cond_wait() routine to complete (it will remain blocked). Programmation Multithread 16

9 Sémaphore Sémaphore est un compteur entier positif Utilisé pour coordonner l accès aux ressources, il est initialisé au départ avec le nombre de ressources libres Lorsqu une ressource est ajoutée, le sémaphore est incrémenté et décrémenté lorsqu une ressource est enlevée Lorsque le sémaphore est nul, il indique qu aucune ressource n est disponible, et un Thread qui essaye de de le décrémenter se bloque jusqu à ce qu il devient positif Programmation Multithread 17 Déclaration d un d sémaphores #include <semaphore.h> sem_t sem; Initialisation int sem_init (sem_t *sem, int pshared, unsigned int value); - Sem sémaphore à initialiser - pshared = 1 si le sémaphore est partagé avec d autres applications. Non supporté dans Linux = 0 si non - value valeur à initialiser Exemple: sem_init(&sem_name, 0, 10); Programmation Multithread 18

10 Attente d un d sémaphores int sem_wait(sem_t *sem); Si la valeur associée au sem est nulle, le Thread bloque (va en sleep ) jusqu à ce qu elle devienne > 0. Si la valeur associée au sem est positive, elle est décrémentée et le Thread continue C est équivalent à demander une ressource - si au moins une ressource est disponible, on la prend et continue - si non, attendre jusqu à ce qu une ressource soit disponible Programmation Multithread 19 Libération d un d sémaphores Syntaxe int sem_post(sem_t *sem); sem_post incrémente la valeur du sémaphore sem S il y a des Threads en attente du sémaphore, un d entre eux sera réveillé Programmation Multithread 20

11 Destruction d un d sémaphore s int sem_destroy (sem_t *sem); Détruit un sémaphore; aucun Thread devrait être en attente du sémaphore si sa destruction s en suit. Exemple d utilisation sem_destroy (&sem_name); Programmation Multithread 21 Accès à la valeur d un d sémaphore s Pour connaitre la valeur associée avec un sémaphore int sem_getvalue(sem_t *sem, int *valp); La valeur courante du sem est placée à l adresse pointée par valp Example: int value; sem_getvalue(&sem_name, &value); printf("the value of the semaphors is %d\n", value); Programmation Multithread 22

12 Performances Les performances sont mesurées sur un SPARC Ultra Mhz Programmation Multithread 23 Modèles de codage en Pthreads Délégation Peer-to to-peer Producteur consommateur consommateur Pipeline Programmation Multithread 24

13 Modèles de codage en Pthreads Délégation: Un Thread principal crée e les autres threads et leur assigne une tâche. Il peut aussi attendre jusqu à ce que la tâche soit complétée. Programmation Multithread 25 Modèles de codage en Pthreads Délégation: Programmation Multithread 26

14 Modèles de codage en Pthreads Délégation: Programmation Multithread 27 Modèles de codage en Pthreads Peer to Peer: Tous les threads ont un statut de travail égal Un thread pair crée e tous les threads nécessaires à une tâche mais il ne délègue d pas des responsabilités. s. Les threads pair peuvent traiter des requêtes d un d simple input stream partagé par tous les threads ou avoir chacun leur propre input stream. Programmation Multithread 28

15 Modèles de codage en Pthreads Peer to Peer Programmation Multithread 29 Modèles de codage en Pthreads Peer to Peer Programmation Multithread 30

16 Modèles de codage en Pthreads Producteur-Consommateur: Un thread producteur génèreg du data pour être consommé par le thread consommateur. Le data est emmagasiné dans un block mémoire m moire partagé par les threads producteurs et consommateur. Programmation Multithread 31 Modèles de codage en Pthreads Producteur-Consommateur: Programmation Multithread 32

17 Modèles de codage en Pthreads Pipeline: Approche semblable à une ligne de production pour traiter des données par étapes (stages( stages). Chaque stage est un thread qui fait du travail sur une unité d entrée. e. Lorsque l unitl unité d entrée e passe par tous les stages, le traitement est complété. Programmation Multithread 33 Modèles de codage en Pthreads Pipeline: Programmation Multithread 34