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 :

Probleme Bouclage producteurs consommateurs


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2018
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Probleme Bouclage producteurs consommateurs
    Bonjour,
    Je vous contacte car j'ai besoin d'aide je n'arrive pas à comprendre pourquoi mon code ne boucle pas. Pouvez vous m'aider?
    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
     
    namespace ConsoleApplication7
    {
        class Program
        {
     
            private static Mutex _muxFabri = new Mutex();
            private static Mutex _muxConso = new Mutex();
     
            Random rnd = new Random();
     
            private static int panier1 = 0;
     
            static void Main(string[] args)
            {
                Console.Title = "Exemple de Mutex";
     
                Thread fab = new Thread(Fabric);
                fab.Start();
     
                Thread conso = new Thread(Conso);
                conso.Start();
     
                Console.ReadKey();
            }
     
            private static void Fabric()
            {
                while (true)
                {
                    lock (_muxFabri)
                    {
     
                        //sleep
                        while (panier1 == 5)
                        {
                            Console.WriteLine(" Le panier 1 est complet");
                            Monitor.Wait(_muxFabri);
                        }
                        panier1++;
                        Console.WriteLine(" Fabrication d'une piece P1 -- ({0})", panier1);
     
                        if (panier1 == 1)
                            Monitor.Pulse(_muxFabri);
                    }
                }
            }
     
            private static void Conso()
            {
                while (true)
                {
                    //sleep
                    lock (_muxConso)
                    {
                        while (panier1 == 0)
                        {
                            Console.WriteLine(" Le panier 1 est vide");
                            Monitor.Wait(_muxConso);
                        }
     
                        panier1--;
                        Console.WriteLine("Consommation d'une piece P1 -- ({0})", panier1);
     
                        if(panier1 == 4)
                        {
                            Monitor.Pulse(_muxConso);
                        }
                    }
                }
            }
        }
    }

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a des moyens moins étrange de faire ce que tu veux faire je pense (et plus lisible surement)
    revoit le fonctionnement de lock et monitor car tu as du mal comprendre (et peut etre de mutex aussi, mais celui là je l'ai jamais utilisé) ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Le problème est simple. Cela ne boucle pas car ton producteur attends le signal "panier plein" (Monitor.Wait(_muxFabri)) et ton consommateur le signal "panier vide" (Monitor.Wait(_muxConso)). Il faut bien entendu faire le contraire. Mais dans ce cas, si tu ne fais pas les choses correctement, tu vas obtenir un interblocage.

    Il serait plus simple d'utiliser un ManualResetEvent.

    Quoiqu'il en soit, voici une solution fonctinonelle avec Monitor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
     
    namespace ConsoleApplication7
    {
        class Program
        {
     
            private static object _panierPasPlein = new object();
            private static object _panierPasVide = new object();
            private static object _mutex = new object();
     
            Random rnd = new Random();
     
            private static int panier1 = 0;
     
            static void Main(string[] args)
            {
                Console.Title = "Exemple de Mutex";
     
                Thread fab = new Thread(Fabric);
                fab.Start();
     
                Thread conso = new Thread(Conso);
                conso.Start();
     
                Console.ReadKey();
            }
     
            private static void Fabric()
            {
                while (true)
                {
                    int nombreElements;
     
                    lock (_mutex)
                    {
                        nombreElements = panier1;
                    }
     
                    //sleep
                    while (nombreElements == 5)
                    {
                        Console.WriteLine(" Le panier 1 est complet");
     
                        lock (_panierPasPlein)
                        {
                            Monitor.Wait(_panierPasPlein);
                        }
     
                        lock (_mutex)
                        {
                            nombreElements = panier1;
                        }
                    }
     
                    lock(_mutex)
                    {
                        Console.WriteLine(" Fabrication d'une piece P1 -- ({0})", panier1);
                        panier1++;
                    }
     
                    lock (_panierPasVide)
                    {
                        Monitor.Pulse(_panierPasVide);
                    }
                }
            }
     
            private static void Conso()
            {
                while (true)
                {
                    int nombreElements;
                    //sleep
                    lock (_panierPasVide)
                    {
                        Monitor.Wait(_panierPasVide);
                    }
     
                    lock(_mutex)
                    {
                        nombreElements = panier1;
                    }
     
                    while (nombreElements == 0)
                    {
                        Console.WriteLine(" Le panier 1 est vide");
                        lock (_panierPasVide)
                        {
                            Monitor.Wait(_panierPasVide);
                            lock (_mutex)
                            {
                                nombreElements = panier1;
                            }
                        }
                    }
     
                    lock(_mutex)
                    {
                        panier1--;
                        Console.WriteLine("Consommation d'une piece P1 -- ({0})", panier1);
                    }
     
                    lock (_panierPasPlein)
                    {
                        Monitor.Pulse(_panierPasPlein);
                    }
                }
            }
        }
    }
    Remarquez bien la taille des lock, qui est réduite au minimum.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. Probleme producteur consommateur
    Par osky083 dans le forum Ada
    Réponses: 1
    Dernier message: 15/12/2009, 08h40
  2. Sémaphores Producteur consommateur Windows
    Par Artusamak dans le forum Windows
    Réponses: 4
    Dernier message: 06/04/2007, 09h40
  3. Interface producteur/consommateur utilisant SWING
    Par El pistol dans le forum AWT/Swing
    Réponses: 17
    Dernier message: 03/04/2006, 15h06
  4. [Threads]Producteur - Consommateur - Filemessages
    Par slim dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 08/03/2006, 18h57
  5. Réponses: 8
    Dernier message: 09/02/2006, 18h51

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