IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problèmes pour finir un exercice : sémaphore et thread


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Problèmes pour finir un exercice : sémaphore et thread
    Bonjour je suis complètement perdu sur mon exercice d'entrainement aux sémaphore,quelqu'un pourrait m'aider,il me guider pas à pas svp:

    on étudie le problème producteur-consommateur. Supposons
    que l’on souhaite pouvoir échanger des données entre 10 threads producteurs
    et 10 threads consommateurs. Cela se fait par l’utilisation d’un tampon partage.
    Chacun de ces producteurs souhaite écrire son nom et son produit dans le tampon
    afin qu’il soit lu par le consommateur.

    1. Dans un premier temps, on implémente une solution au problème sans utilisation
    de sémaphore. Dans cette solution, on souhaite que chaque producteur
    affiche son nom et son produit pour chaque écriture et que le consommateur
    affiche ce qu’il a lu pour chaque lecture.
    (a) Écrire une fonction main() qui lance les threads producteurs et les
    threads consommateurs, ainsi que les fonctions définissant le comportement
    des threads.
    (b) Observer l’affichage du programme pour voir s’il y a des incohérences
    de données.
    2. Implémenter une solution au problème avec utilisation de sémaphore. Comparer
    les deux solutions.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Perso je n'utilise pas les thread donc je ne sais pas m'en servir mais c'est annexe.

    Un sémaphore est un outil destiné à protéger une (ou plusiers) ressource d'accès concurrents (et destructeurs) éventuels. Par exemple dans ta zone tampon, si T1 (le thread n° 1) écrit un truc et que T2 écrit autre chose, l'info de T1 est perdue. Le sémaphore (qui est géré par l'OS) permet d'empêcher cela.
    Il faut travailler de la façon suivante
    1. tu initialises ton sémaphore à "n" (n" étant le nombre de ressources à protéger).
    2. chaque thread qui veut accéder aux ressources effectue une décrémentation de "n". Admettons à ce moment là qu'il y en ait deux. La magie du sémaphore entre alors en jeu car étant donné qu'il ne peut pas être négatif, un seul des threads pourra effectuer cette décrémentation ; tandis que l'autre restera bloqué, en attente que l'opération se fasse.
    3. le thread qui a "pu passer" peut alors tranquillement travailler sur l'ensemble des ressources en question
    4. ce même thread finit son travail. Il effectue alors une incrémentation de "n", le sémaphore remonte à sa valeur "n" initiale
    5. l'autre thread qui était en attente peut alors effectuer sa décrémentation. Le sémaphore repasse à 0 bloquant alors tout autre thread éventuel pendant que le thread en question fait lui ce qu'il avait à faire.
    6. l'autre thread termine et "referme" alors le sémaphore en lui incrémentant sa valeur. D'autres threads qui ont besoin des ressources peuvent alors si besoin le "réouvrir" par la décrémentation. Le même mécanisme se reproduira...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Je ne comprend pas l’initialiser à "n" c'est à dire ? le sémaphore est à 10 ?après c'est une boucle de 10 à 0 mais comment décrémenter une sémaphore n fois j'utilise une boucle sur sem_wait() n fois

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par leandro95 Voir le message
    Citation Envoyé par Sve@r Voir le message
    [*] tu initialises ton sémaphore à "n" (n" étant le nombre de ressources à protéger).
    Je ne comprend pas l’initialiser à "n" c'est à dire ? le sémaphore est à 10 ?après c'est une boucle de 10 à 0 mais comment décrémenter une sémaphore n fois j'utilise une boucle sur sem_wait() n fois

    Pourquoi "10" ? Aurais-tu 10 ressources à protéger ??? C'est quand-même simple: il y a une place de parking, et 500 voitures qui veulent y entrer. Est-ce que tu mettras une barrière ou bien 500 barrières ???

    Et "décrémenter de n". Tu ne sais donc pas faire une simple soustraction (ici ce sera plutôt un sem_op) que tu veuilles faire une boucle ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Ici ton sémaphore est utilisé comme un mutex. La valeur maximal du sémaphore sera 1.

    PS : D'ailleurs, c'est étonnant d'utiliser un sémaphore et non un mutex dans un programme multi-thread. Sauf si tu confonds thread et processus ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    PS : D'ailleurs, c'est étonnant d'utiliser un sémaphore et non un mutex dans un programme multi-thread.
    Hum.. dans la mesure ou un mutex n'est qu'un sémaphore particulier, autant rester général non ?

    Citation Envoyé par dinobogan Voir le message
    Sauf si tu confonds thread et processus ?
    Ben moi je les confonds un petit peu. Me semble qu'un thread c'est le nom que windows donne à ses procesus. Et que ça y ressemble beaucoup sauf que les processus Unix sont bien séparés en tout alors que les thread windows, eux, partagent tout. C'est un peu comme ça que je les vois. Et donc qu'utiliser un sémaphore pour réguler plusieurs threads n'est pas incompatible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum.. dans la mesure ou un mutex n'est qu'un sémaphore particulier, autant rester général non ?
    Je parlais de sémaphore au sens IPC (externe au processus, gérer par l'OS) et du mutex au sens pthread_mutex_t (interne au processus, invisible de l'extérieur).

    Ben moi je les confonds un petit peu. Me semble qu'un thread c'est le nom que windows donne à ses procesus. Et que ça y ressemble beaucoup sauf que les processus Unix sont bien séparés en tout alors que les thread windows, eux, partagent tout. C'est un peu comme ça que je les vois. Et donc qu'utiliser un sémaphore pour réguler plusieurs threads n'est pas incompatible...
    Les threads Unix partagent tout également. Utilisé un sémaphore n'est pas incompatible, c'est vrai. Mais c'est dommage d'utiliser une ressource IPC pour un usage exclusivement interne à un processus.
    Mais c'est très certainement dans le cadre d'un exercice, donc tu peux oublier ma remarque
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/05/2015, 16h33
  2. Problème pour terminer un thread
    Par BestFF dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 05/07/2008, 22h03
  3. Problème pour stopper thread avec runnable
    Par fabou3377 dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 13/03/2008, 13h43
  4. Probléme pour tuer un Thread
    Par peyo_le_fou dans le forum POSIX
    Réponses: 5
    Dernier message: 04/11/2006, 14h10
  5. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo