Université de Bouira – Département d'Informatique – Année universitaire 2017-2018
Systèmes d'exploitation des ordinateurs – 23ème année
TP 2 : Création de threads sous Linux
Exercice 1
Problème des accès concurrents
Écrire un programme qui initialise une variable entière globale valueglobale à 1 et crée deux threads, tha et thb.
Le thread tha incrémente valueglobale 100 000 fois et le thread thb décrémente valueglobale 100 000 fois.
Questions
- Quelle devrait être la valeur finale de
valueglobale? - Que remarquez-vous après plusieurs exécutions du programme ?
- Expliquer ce phénomène.
Rappels des fonctions de manipulation des threads
#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void*), void *arg);La fonction
pthread_createcrée un thread et renvoie 0 si la création s'est déroulée avec succès, ou un code d'erreur sinon. Elle reçoit en argument :- le TID (Thread Identifier) du thread,
- une constante (attributs du thread),
- un pointeur vers la fonction exécutée par le thread,
- un argument de la fonction.
int pthread_exit(void *valueptr);La fonction
pthread_exitpermet de quitter un thread.int pthread_join(pthread_t *thread, void **valueptr);La fonction
pthread_joinbloque l'appelant en attente de la fin du thread passé en premier argument, tandis que le second argument est un pointeur de pointeur qui servira à récupérer l'adresse de la valeur renvoyée par le thread lors de sonexit. Cette fonction renvoie 0 si le thread se termine correctement, sinon elle renvoie un code d'erreur.
FAQ
Pourquoi la valeur finale de valueglobale n'est-elle pas toujours 0 ?
Les threads s'exécutent de manière concurrente et non synchronisée. Chaque incrémentation ou décrémentation de la variable est une opération qui peut être interrompue par l'autre thread, provoquant des incohérences.
Comment résoudre ce problème d'accès concurrent ?
Utilisez des mécanismes de synchronisation comme les mutex (pthread_mutex_t) pour protéger l'accès à la variable partagée. Cela garantit que seul un thread peut modifier la variable à la fois.
Qu'est-ce qu'un mutex et à quoi sert-il ?
Un mutex (mutual exclusion) est un verrou qui permet de contrôler l'accès à une ressource partagée. Il empêche les threads d'accéder simultanément à une section critique de code, évitant ainsi les problèmes de concurrence.