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

POSIX C Discussion :

Erreur lors de l'execution de l'exemple du tutoriel


Sujet :

POSIX C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Erreur lors de l'execution de l'exemple du tutoriel
    Bonjour,
    Ayant besoin d'utiliser des Threads pour mon project C++ jusqu'alors monothreadé, je pense utiliser la bibliothèque de posix p_thread pour cela.
    J'ai donc lu le tutoriel a ce sujet sur ce site :
    http://franckh.developpez.com/tutoriels/posix/pthreads/
    (Dernière mise à jour de novembre 2007)
    j'ai bien sur voulu tester cela a partir des archives fournis.
    j'ai donc récupérer :
    pthread-exemple-3.zip dans lequel j'ai récupérer le code source
    pthreads-w32-2-8-0-release.exe que j'ai exécuter afin d'extraire la bibliothèque proprement dite

    Puis :
    j'ai créer un nouveau projet sous visual C++ express 2005 (empty project)
    j' y est ajouter le code source de l'exemple 3

    Dans les propriété du projet :
    j'ai rajouter une référence d'include aux header de la biblothèque que je viens d'extraire
    j'ai rajouter une référence au répertoire des librairies que je viens d'extraire
    j'ai rajouter la librairies pthreadVC2.lib comme "input"
    j'ai définie des variables de preprocesseur : Win32; _REENTRANT

    a savoir que le code de base est le suivant :
    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #if defined (Win32)
    #  include <windows.h>
    #  define psleep(sec) Sleep ((sec) * 1000)
    #elif defined (Linux)
    #  include <unistd.h>
    #  define psleep(sec) sleep ((sec))
    #endif
     
    #define INITIAL_STOCK   20
    #define NB_CLIENTS      5
     
     
    /* Structure stockant les informations des threads clients et du magasin. */
    typedef struct
    {
       int stock;
     
       pthread_t thread_store;
       pthread_t thread_clients [NB_CLIENTS];
     
       pthread_mutex_t mutex_stock;
       pthread_cond_t cond_stock;
       pthread_cond_t cond_clients;
    }
    store_t;
     
     
    static store_t store =
    {
       .stock = INITIAL_STOCK,
       .mutex_stock = PTHREAD_MUTEX_INITIALIZER,
       .cond_stock = PTHREAD_COND_INITIALIZER,
       .cond_clients = PTHREAD_COND_INITIALIZER
    };
     
     
    /* Fonction pour tirer un nombre au sort entre 0 et max. */
    static int get_random (int max)
    {
       double val;
     
       val = (double) max * rand ();
       val = val / (RAND_MAX + 1.0);
     
       return ((int) val);
    }
     
     
    /* Fonction pour le thread du magasin. */
    static void * fn_store (void * p_data)
    {
       while (1)
       {
          /* Debut de la zone protegee. */
          pthread_mutex_lock (& store.mutex_stock);
          pthread_cond_wait (& store.cond_stock, & store.mutex_stock);
     
          store.stock = INITIAL_STOCK;
          printf ("Remplissage du stock de %d articles !\n", store.stock);
     
          pthread_cond_signal (& store.cond_clients);
          pthread_mutex_unlock (& store.mutex_stock);
          /* Fin de la zone protegee. */
       }
     
       return NULL;
    }
     
     
    /* Fonction pour les threads des clients. */
    static void * fn_clients (void * p_data)
    {
       int nb = (int) p_data;
     
       while (1)
       {
          int val = get_random (6);
     
     
          psleep (get_random (3));
     
          /* Debut de la zone protegee. */
          pthread_mutex_lock (& store.mutex_stock);
     
          if (val > store.stock)
          {
             pthread_cond_signal (& store.cond_stock);
             pthread_cond_wait (& store.cond_clients, & store.mutex_stock);
          }
     
          store.stock = store.stock - val;
          printf (
             "Client %d prend %d du stock, reste %d en stock !\n",
             nb, val, store.stock
          );
     
          pthread_mutex_unlock (& store.mutex_stock);
          /* Fin de la zone protegee. */
       }
     
       return NULL;
    }
     
     
    int main (void)
    {
       int i = 0;
       int ret = 0;
     
     
       /* Creation des threads. */
       printf ("Creation du thread du magasin !\n");
       ret = pthread_create (
          & store.thread_store, NULL,
          fn_store, NULL
       );
     
       /* Creation des threads des clients si celui du magasinn a reussi. */
       if (! ret)
       {
          printf ("Creation des threads clients !\n");
          for (i = 0; i < NB_CLIENTS; i++)
          {
             ret = pthread_create (
                & store.thread_clients [i], NULL,
                fn_clients, (void *) i);
     
             if (ret)
             {
                fprintf (stderr, "%s", strerror (ret));
             }
          }
       }
       else
       {
          fprintf (stderr, "%s", strerror (ret));
       }
     
     
       /* Attente de la fin des threads. */
       i = 0;
       for (i = 0; i < NB_CLIENTS; i++)
       {
          pthread_join (store.thread_clients [i], NULL);
       }
       pthread_join (store.thread_store, NULL);
     
     
       return EXIT_SUCCESS;
    }
    et que le compilateur n'aprecie pas l'initialisation de la varaible structure global comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    static store_t store =
    {
       .stock = INITIAL_STOCK,
       .mutex_stock = PTHREAD_MUTEX_INITIALIZER,
       .cond_stock = PTHREAD_COND_INITIALIZER,
       .cond_clients = PTHREAD_COND_INITIALIZER
    };
    j'ai donc fait ici un changement, j'ai effectuer l'initialisation suivante a la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static store_t store =
    {
       INITIAL_STOCK,
       PTHREAD_MUTEX_INITIALIZER,
       PTHREAD_COND_INITIALIZER,
       PTHREAD_COND_INITIALIZER
    };
    A noter que ci mon fichier source porte l'extension *.cpp alors ce code ne compile toujours pas, : il me signal une erreur au moment d'utiliser la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PTHREAD_COND_INITIALIZER
    :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1>Compiling...
    1>MultiThreadScript.cpp
    1>\multithreadscript.cpp(36) : error C2440: 'initializing' : cannot convert from 'pthread_cond_t' to 'unsigned int'
    1>        There is no context in which this conversion is possible
    Erreur qui se "transforme" en warning si je force l'extension du fichier en *.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1>Compiling...
    1>MultiThreadScript.c
    1>\multithreadscript.c(36) : warning C4047: 'initializing' : 'unsigned int' differs in levels of indirection from 'pthread_cond_t'
    ...

    Je lance alors l'exécutable nouvellement créé et l'application crash alors sur une exception non gérée (Unhandled exception) dans la fonction au niveau de ces ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         pthread_mutex_unlock (& store.mutex_stock);
    avec cet output ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Creation du thread du magasin !
    Creation des threads clients !
    Remplissage du stock de 20 articles !
    -> puis plantage.

    On vois que bizarrement malgrès la présence de variable condition il rentre dans l'exécution de directement alors qu'il devrais se bloquer sur la condition ...

    Peut être l'exemple du tutoriel n'est pas compatible avec visual C++ express, ... uniquement avec GCC ?

    Merci de m'éclairer sur ce point de base afin que je puisse prendre cette librairie en main sereinement

    EDIT : j'ajoute que l'exemple 1 fonction par contre, avec toujour un changement pour l'initialisation de la variable structure sans le Mais que l'exemple 2 ne fonctionne pas (avec l'utilisation des mutex) et plante aussi sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_mutex_unlock (& store.mutex_stock);
    RE EDIT : A cause de l'initailisation : comme je ne peut pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static store_t store =
    {
       .stock = INITIAL_STOCK,
       .mutex_stock = PTHREAD_MUTEX_INITIALIZER
    };
    je faisait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static store_t store =
    {
       INITIAL_STOCK,
       PTHREAD_MUTEX_INITIALIZER
    };
    mais les champs de la structure étant déclarer dans un autre ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
       int stock;
     
       pthread_t thread_store;
       pthread_t thread_clients [NB_CLIENTS];   
     
      pthread_mutex_t mutex_stock;
    }
    store_t;
    bien sur j'initialisait le mauvais champs !

    J'ai redéfinit alors l'odre des champs comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct
    {
       int stock;
       pthread_mutex_t mutex_stock;
       pthread_t thread_store;
       pthread_t thread_clients [NB_CLIENTS];   
    }
    store_t;
    et la ça semble marcher ; je dit semble car je n'ai pas de vrais random entre mes thread apparemment :
    voici la sortie :
    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
     
    Creation du thread du magasin !
    Creation des threads clients !
    Client 0 prend 0 du stock, reste 20 en stock !
    Client 2 prend 0 du stock, reste 20 en stock !
    Client 4 prend 0 du stock, reste 20 en stock !
    Client 1 prend 0 du stock, reste 20 en stock !
    Client 3 prend 0 du stock, reste 20 en stock !
    Client 0 prend 1 du stock, reste 19 en stock !
    Client 2 prend 1 du stock, reste 18 en stock !
    Client 4 prend 1 du stock, reste 17 en stock !
    Client 1 prend 1 du stock, reste 16 en stock !
    Client 3 prend 1 du stock, reste 15 en stock !
    Client 0 prend 3 du stock, reste 12 en stock !
    Client 4 prend 3 du stock, reste 9 en stock !
    Client 2 prend 3 du stock, reste 6 en stock !
    Client 1 prend 3 du stock, reste 3 en stock !
    Client 3 prend 3 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 2 du stock, reste 18 en stock !
    Client 2 prend 2 du stock, reste 16 en stock !
    Client 4 prend 2 du stock, reste 14 en stock !
    Client 1 prend 2 du stock, reste 12 en stock !
    Client 3 prend 2 du stock, reste 10 en stock !
    Client 0 prend 4 du stock, reste 6 en stock !
    Client 2 prend 4 du stock, reste 2 en stock !
    Client 4 prend 4 du stock, reste -2 en stock !
    Remplissage du stock de 20 articles !
    Client 1 prend 4 du stock, reste 16 en stock !
    Client 3 prend 4 du stock, reste 12 en stock !
    Client 0 prend 1 du stock, reste 11 en stock !
    Client 4 prend 1 du stock, reste 10 en stock !
    Client 2 prend 1 du stock, reste 9 en stock !
    Client 1 prend 1 du stock, reste 8 en stock !
    Client 3 prend 1 du stock, reste 7 en stock !
    Client 0 prend 4 du stock, reste 3 en stock !
    Client 0 prend 1 du stock, reste 2 en stock !
    Client 2 prend 4 du stock, reste -2 en stock !
    Client 4 prend 4 du stock, reste -6 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 1 du stock, reste 19 en stock !
    Client 4 prend 1 du stock, reste 18 en stock !
    Client 3 prend 4 du stock, reste 14 en stock !
    Client 1 prend 4 du stock, reste 10 en stock !
    Client 3 prend 1 du stock, reste 9 en stock !
    Client 1 prend 1 du stock, reste 8 en stock !
    Client 0 prend 0 du stock, reste 8 en stock !
    Client 0 prend 0 du stock, reste 8 en stock !
    Client 2 prend 0 du stock, reste 8 en stock !
    Client 4 prend 0 du stock, reste 8 en stock !
    Client 2 prend 0 du stock, reste 8 en stock !
    Client 4 prend 0 du stock, reste 8 en stock !
    Client 3 prend 0 du stock, reste 8 en stock !
    Client 1 prend 0 du stock, reste 8 en stock !
    Client 3 prend 0 du stock, reste 8 en stock !
    Client 1 prend 0 du stock, reste 8 en stock !
    Client 0 prend 5 du stock, reste 3 en stock !
    Client 0 prend 0 du stock, reste 3 en stock !
    Client 2 prend 5 du stock, reste -2 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 5 du stock, reste 15 en stock !
    Client 2 prend 0 du stock, reste 15 en stock !
    Client 4 prend 0 du stock, reste 15 en stock !
    Client 3 prend 5 du stock, reste 10 en stock !
    Client 3 prend 0 du stock, reste 10 en stock !
    Client 1 prend 5 du stock, reste 5 en stock !
    Client 1 prend 0 du stock, reste 5 en stock !
    Client 0 prend 0 du stock, reste 5 en stock !
    Client 2 prend 0 du stock, reste 5 en stock !
    Client 4 prend 0 du stock, reste 5 en stock !
    Client 1 prend 0 du stock, reste 5 en stock !
    Client 3 prend 0 du stock, reste 5 en stock !
    Client 0 prend 3 du stock, reste 2 en stock !
    Client 2 prend 3 du stock, reste -1 en stock !
    Client 4 prend 3 du stock, reste -4 en stock !
    Remplissage du stock de 20 articles !
    Client 1 prend 3 du stock, reste 17 en stock !
    Client 3 prend 3 du stock, reste 14 en stock !
    Client 0 prend 3 du stock, reste 11 en stock !
    Client 2 prend 3 du stock, reste 8 en stock !
    Client 4 prend 3 du stock, reste 5 en stock !
    Client 1 prend 3 du stock, reste 2 en stock !
    Client 3 prend 3 du stock, reste -1 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 0 du stock, reste 20 en stock !
    Client 2 prend 0 du stock, reste 20 en stock !
    Client 4 prend 0 du stock, reste 20 en stock !
    Client 1 prend 0 du stock, reste 20 en stock !
    Client 3 prend 0 du stock, reste 20 en stock !

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par eltrex Voir le message
    a savoir que le code de base est le suivant :
    Pas mal de problèmes dans ce code :

    - strerror() est une extension POSIX.1.
    - ceci est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #if defined (Win32)
    #  include <windows.h>
    #  define psleep(sec) Sleep ((sec) * 1000)
    #elif defined (Linux)
    #  include <unistd.h>
    #  define psleep(sec) sleep ((sec))
    #endif
    on s'en aperçoit en complétant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #if defined (Win32)
    #  include <windows.h>
    #  define psleep(sec) Sleep ((sec) * 1000)
    #elif defined (Linux)
    #  include <unistd.h>
    #  define psleep(sec) sleep ((sec))
    #else
    #error Not defined on this plateform
    #endif
    ce qui provoque une erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\dev\hello\main.c:12:2: #error Not defined on this plateform
    sous Windows, parce que Win32 n'est pas défini. C'est _WIN32. Ceci est correct (sous Windows) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #if defined (_WIN32)
    #  include <windows.h>
    #  define psleep(sec) Sleep ((sec) * 1000)
    #elif defined (Linux)
    #  include <unistd.h>
    #  define psleep(sec) sleep ((sec))
    #else
    #error Not defined on this plateform
    #endif
    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static store_t store =
    {
       .stock = INITIAL_STOCK,
       .mutex_stock = PTHREAD_MUTEX_INITIALIZER,
       .cond_stock = PTHREAD_COND_INITIALIZER,
       .cond_clients = PTHREAD_COND_INITIALIZER
    };
    est une nouveauté du C99. Evidemment, sous Visual C++, ça n'existe pas.

    Il faut donc modifier le code.
    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #if defined (_WIN32)
    #  include <windows.h>
    #  define psleep(sec) Sleep ((sec) * 1000)
    #elif defined (Linux)
    #  include <unistd.h>
    #  define psleep(sec) sleep ((sec))
    #else
    #error Not defined on this plateform
    #endif
     
    #define INITIAL_STOCK   20
    #define NB_CLIENTS      5
     
    /* Structure stockant les informations des threads clients et du magasin. */
    typedef struct
    {
       int stock;
     
       pthread_t thread_store;
       pthread_t thread_clients[NB_CLIENTS];
     
       pthread_mutex_t mutex_stock;
       pthread_cond_t cond_stock;
       pthread_cond_t cond_clients;
    }
    store_t;
     
    static store_t store;
     
    /* Fonction pour tirer un nombre au sort entre 0 et max. */
    static int get_random (int max)
    {
       double val;
     
       val = (double) max *rand ();
       val = val / (RAND_MAX + 1.0);
     
       return ((int) val);
    }
     
    /* Fonction pour le thread du magasin. */
    static void *fn_store (void *p_data)
    {
       while (1)
       {
          /* Debut de la zone protegee. */
          pthread_mutex_lock (&store.mutex_stock);
          pthread_cond_wait (&store.cond_stock, &store.mutex_stock);
     
          store.stock = INITIAL_STOCK;
          printf ("Remplissage du stock de %d articles !\n", store.stock);
     
          pthread_cond_signal (&store.cond_clients);
          pthread_mutex_unlock (&store.mutex_stock);
          /* Fin de la zone protegee. */
       }
     
       return NULL;
    }
     
    /* Fonction pour les threads des clients. */
    static void *fn_clients (void *p_data)
    {
       int nb = (int) p_data;
     
       while (1)
       {
          int val = get_random (6);
     
          psleep (get_random (3));
     
          /* Debut de la zone protegee. */
          pthread_mutex_lock (&store.mutex_stock);
     
          if (val > store.stock)
          {
             pthread_cond_signal (&store.cond_stock);
             pthread_cond_wait (&store.cond_clients, &store.mutex_stock);
          }
     
          store.stock = store.stock - val;
          printf ("Client %d prend %d du stock, reste %d en stock !\n",
                  nb, val, store.stock);
     
          pthread_mutex_unlock (&store.mutex_stock);
          /* Fin de la zone protegee. */
       }
     
       return NULL;
    }
     
    int main (void)
    {
       int i = 0;
       int ret = 0;
     
       store.stock = INITIAL_STOCK;
       store.mutex_stock = PTHREAD_MUTEX_INITIALIZER;
       store.cond_stock = PTHREAD_COND_INITIALIZER;
       store.cond_clients = PTHREAD_COND_INITIALIZER;
     
       /* Creation des threads. */
       printf ("Creation du thread du magasin !\n");
       ret = pthread_create (&store.thread_store, NULL, fn_store, NULL);
     
       /* Creation des threads des clients si celui du magasinn a reussi. */
       if (!ret)
       {
          printf ("Creation des threads clients !\n");
          for (i = 0; i < NB_CLIENTS; i++)
          {
             ret = pthread_create (&store.thread_clients[i], NULL,
                                   fn_clients, (void *) i);
     
             if (ret)
             {
                fprintf (stderr, "err = %d\n", ret);
             }
          }
       }
       else
       {
          fprintf (stderr, "err = %d\n", ret);
       }
     
       /* Attente de la fin des threads. */
       i = 0;
       for (i = 0; i < NB_CLIENTS; i++)
       {
          pthread_join (store.thread_clients[i], NULL);
       }
       pthread_join (store.thread_store, NULL);
     
       return EXIT_SUCCESS;
    }
    Ceci fonctionne chez moi...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse rapide
    Pour ce qui est des MACRO je les avait définit "en dur" en les rajoutant dans les propriété du projet, mais utiliser _Win32 est en effet mieux car c'est le but de cette macro après tout

    Apparement le problème viens bien de l'initialisation de la structure
    (voir mon premier post a la fin dans RE-EDIT) : comme la "nouveauté" du C99 n'était pas implémenté sous Visual C++ (peut que dans la version 2008 ça l'est ?) j'ai fait (trop) rapidement une initialisation des champs a l'ancienne mais sans faire gaffe à l'ordre des champs de la structure : résultat mauvaise initialisation donc plantage !
    en remettant les champs dans le bon ordre, ou mieux faire comme tu as fait (init dans le main), ça marche a priori.
    A priori seulement d'ailleurs car comme dit dans mon premier post dans RE-EDIT : il ne semble pas y avoir de vrai random sur les valeurs entre les différents thread sur un même temps d'exécution.

    Hormis cette étrange histoire de random pas tellement random l'exemple marche.

    EDIT :
    Comme j'écris / parle trop vite, finalement, bien que l'on retrouve cette similarité étrange sur les random au début de l'exécution, celle-ci tend a disparaitre au fur et à mesure :
    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
     
    Creation du thread du magasin !
    Creation des threads clients !
    Client 0 prend 0 du stock, reste 20 en stock !
    Client 4 prend 0 du stock, reste 20 en stock !
    Client 2 prend 0 du stock, reste 20 en stock !
    Client 1 prend 0 du stock, reste 20 en stock !
    Client 3 prend 0 du stock, reste 20 en stock !
    Client 4 prend 1 du stock, reste 19 en stock !
    Client 0 prend 1 du stock, reste 18 en stock !
    Client 2 prend 1 du stock, reste 17 en stock !
    Client 1 prend 1 du stock, reste 16 en stock !
    Client 3 prend 1 du stock, reste 15 en stock !
    Client 0 prend 3 du stock, reste 12 en stock !
    Client 4 prend 3 du stock, reste 9 en stock !
    Client 2 prend 3 du stock, reste 6 en stock !
    Client 1 prend 3 du stock, reste 3 en stock !
    Client 3 prend 3 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 2 du stock, reste 18 en stock !
    Client 2 prend 2 du stock, reste 16 en stock !
    Client 1 prend 2 du stock, reste 14 en stock !
    Client 3 prend 2 du stock, reste 12 en stock !
    Client 0 prend 4 du stock, reste 8 en stock !
    Client 2 prend 4 du stock, reste 4 en stock !
    Client 3 prend 4 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 2 du stock, reste 18 en stock !
    Client 0 prend 1 du stock, reste 17 en stock !
    Client 2 prend 1 du stock, reste 16 en stock !
    Client 3 prend 1 du stock, reste 15 en stock !
    Client 4 prend 4 du stock, reste 11 en stock !
    Client 0 prend 4 du stock, reste 7 en stock !
    Client 0 prend 1 du stock, reste 6 en stock !
    Client 2 prend 4 du stock, reste 2 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 1 du stock, reste 19 en stock !
    Client 1 prend 4 du stock, reste 15 en stock !
    Client 0 prend 0 du stock, reste 15 en stock !
    Client 0 prend 0 du stock, reste 15 en stock !
    Client 2 prend 0 du stock, reste 15 en stock !
    Client 4 prend 1 du stock, reste 14 en stock !
    Client 2 prend 0 du stock, reste 14 en stock !
    Client 0 prend 5 du stock, reste 9 en stock !
    Client 0 prend 0 du stock, reste 9 en stock !
    Client 1 prend 1 du stock, reste 8 en stock !
    Client 4 prend 4 du stock, reste 4 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 1 du stock, reste 19 en stock !
    Client 3 prend 4 du stock, reste 15 en stock !
    Client 3 prend 1 du stock, reste 14 en stock !
    Client 0 prend 0 du stock, reste 14 en stock !
    Client 3 prend 0 du stock, reste 14 en stock !
    Client 4 prend 0 du stock, reste 14 en stock !
    Client 1 prend 4 du stock, reste 10 en stock !
    Client 3 prend 0 du stock, reste 10 en stock !
    Client 4 prend 0 du stock, reste 10 en stock !
    Client 1 prend 1 du stock, reste 9 en stock !
    Client 0 prend 3 du stock, reste 6 en stock !
    Client 3 prend 5 du stock, reste 1 en stock !
    Client 1 prend 0 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 3 prend 0 du stock, reste 20 en stock !
    Client 1 prend 0 du stock, reste 20 en stock !
    Client 2 prend 5 du stock, reste 15 en stock !
    Client 2 prend 0 du stock, reste 15 en stock !
    Client 0 prend 3 du stock, reste 12 en stock !
    Client 3 prend 0 du stock, reste 12 en stock !
    Client 1 prend 5 du stock, reste 7 en stock !
    Client 2 prend 0 du stock, reste 7 en stock !
    Client 1 prend 0 du stock, reste 7 en stock !
    Client 0 prend 0 du stock, reste 7 en stock !
    Client 3 prend 3 du stock, reste 4 en stock !
    Client 2 prend 3 du stock, reste 1 en stock !
    Client 1 prend 0 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 5 du stock, reste 15 en stock !
    Client 4 prend 0 du stock, reste 15 en stock !
    Client 3 prend 3 du stock, reste 12 en stock !
    Client 2 prend 3 du stock, reste 9 en stock !
    Client 1 prend 3 du stock, reste 6 en stock !
    Client 4 prend 0 du stock, reste 6 en stock !
    Client 3 prend 0 du stock, reste 6 en stock !
    Client 2 prend 0 du stock, reste 6 en stock !
    Client 1 prend 3 du stock, reste 3 en stock !
    Client 4 prend 3 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 1 prend 0 du stock, reste 20 en stock !
    Client 0 prend 2 du stock, reste 18 en stock !
    Client 4 prend 3 du stock, reste 15 en stock !
    Client 1 prend 2 du stock, reste 13 en stock !
    Client 0 prend 0 du stock, reste 13 en stock !
    Client 4 prend 0 du stock, reste 13 en stock !
    Client 1 prend 0 du stock, reste 13 en stock !
    Client 4 prend 2 du stock, reste 11 en stock !
    Client 0 prend 4 du stock, reste 7 en stock !
    Client 0 prend 3 du stock, reste 4 en stock !
    Client 4 prend 0 du stock, reste 4 en stock !
    Client 1 prend 4 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 2 du stock, reste 18 en stock !
    Client 0 prend 5 du stock, reste 13 en stock !
    Client 2 prend 0 du stock, reste 13 en stock !
    Client 4 prend 4 du stock, reste 9 en stock !
    Client 4 prend 3 du stock, reste 6 en stock !
    Client 0 prend 5 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 3 du stock, reste 17 en stock !
    Client 3 prend 2 du stock, reste 15 en stock !
    Client 0 prend 2 du stock, reste 13 en stock !
    Client 0 prend 5 du stock, reste 8 en stock !
    Client 4 prend 5 du stock, reste 3 en stock !
    Client 3 prend 0 du stock, reste 3 en stock !
    Remplissage du stock de 20 articles !
    Client 1 prend 3 du stock, reste 17 en stock !
    Client 4 prend 5 du stock, reste 12 en stock !
    Client 4 prend 3 du stock, reste 9 en stock !
    Client 4 prend 2 du stock, reste 7 en stock !
    Client 4 prend 5 du stock, reste 2 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 4 du stock, reste 16 en stock !
    Client 2 prend 3 du stock, reste 13 en stock !
    Client 1 prend 5 du stock, reste 8 en stock !
    Client 4 prend 4 du stock, reste 4 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 4 du stock, reste 16 en stock !
    Client 1 prend 5 du stock, reste 11 en stock !
    Client 1 prend 3 du stock, reste 8 en stock !
    Client 1 prend 2 du stock, reste 6 en stock !
    Client 1 prend 5 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 3 prend 4 du stock, reste 16 en stock !
    Client 3 prend 3 du stock, reste 13 en stock !
    Client 0 prend 5 du stock, reste 8 en stock !
    Client 1 prend 4 du stock, reste 4 en stock !
    Client 0 prend 3 du stock, reste 1 en stock !
    Client 0 prend 1 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 5 du stock, reste 15 en stock !
    Client 3 prend 5 du stock, reste 10 en stock !
    Client 1 prend 5 du stock, reste 5 en stock !
    Client 2 prend 5 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 5 du stock, reste 15 en stock !
    Client 3 prend 5 du stock, reste 10 en stock !
    Client 3 prend 3 du stock, reste 7 en stock !
    Client 3 prend 2 du stock, reste 5 en stock !
    Client 3 prend 5 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 5 du stock, reste 15 en stock !
    Client 0 prend 2 du stock, reste 13 en stock !
    Client 0 prend 4 du stock, reste 9 en stock !
    Client 3 prend 4 du stock, reste 5 en stock !
    Client 0 prend 0 du stock, reste 5 en stock !
    Client 0 prend 1 du stock, reste 4 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 3 du stock, reste 17 en stock !
    Client 2 prend 2 du stock, reste 15 en stock !
    Client 2 prend 5 du stock, reste 10 en stock !
    Client 0 prend 3 du stock, reste 7 en stock !
    Client 2 prend 4 du stock, reste 3 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 3 du stock, reste 17 en stock !
    Client 4 prend 1 du stock, reste 16 en stock !
    Client 4 prend 5 du stock, reste 11 en stock !
    Client 4 prend 2 du stock, reste 9 en stock !
    Client 4 prend 4 du stock, reste 5 en stock !
    Client 2 prend 5 du stock, reste 0 en stock !
    Client 4 prend 0 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 1 prend 3 du stock, reste 17 en stock !
    Client 1 prend 1 du stock, reste 16 en stock !
    Client 1 prend 5 du stock, reste 11 en stock !
    Client 1 prend 2 du stock, reste 9 en stock !
    Client 1 prend 4 du stock, reste 5 en stock !
    Client 2 prend 3 du stock, reste 2 en stock !
    Client 2 prend 1 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 3 prend 5 du stock, reste 15 en stock !
    Client 3 prend 3 du stock, reste 12 en stock !
    Client 3 prend 1 du stock, reste 11 en stock !
    Client 3 prend 5 du stock, reste 6 en stock !
    Client 3 prend 2 du stock, reste 4 en stock !
    Client 3 prend 4 du stock, reste 0 en stock !
    Client 1 prend 0 du stock, reste 0 en stock !
    Remplissage du stock de 20 articles !
    Client 0 prend 5 du stock, reste 15 en stock !
    Client 0 prend 2 du stock, reste 13 en stock !
    Client 0 prend 4 du stock, reste 9 en stock !
    Client 3 prend 0 du stock, reste 9 en stock !
    Client 3 prend 1 du stock, reste 8 en stock !
    Client 0 prend 2 du stock, reste 6 en stock !
    Client 0 prend 4 du stock, reste 2 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 1 du stock, reste 19 en stock !
    Client 0 prend 3 du stock, reste 16 en stock !
    Client 0 prend 4 du stock, reste 12 en stock !
    Client 4 prend 3 du stock, reste 9 en stock !
    Client 0 prend 3 du stock, reste 6 en stock !
    Client 0 prend 0 du stock, reste 6 en stock !
    Client 4 prend 5 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 2 prend 5 du stock, reste 15 en stock !
    Client 2 prend 2 du stock, reste 13 en stock !
    Client 2 prend 4 du stock, reste 9 en stock !
    Client 0 prend 2 du stock, reste 7 en stock !
    Client 2 prend 0 du stock, reste 7 en stock !
    Client 2 prend 1 du stock, reste 6 en stock !
    Client 0 prend 3 du stock, reste 3 en stock !
    Remplissage du stock de 20 articles !
    Client 1 prend 1 du stock, reste 19 en stock !
    Client 2 prend 3 du stock, reste 16 en stock !
    Client 1 prend 3 du stock, reste 13 en stock !
    Client 2 prend 5 du stock, reste 8 en stock !
    Client 2 prend 2 du stock, reste 6 en stock !
    Client 2 prend 4 du stock, reste 2 en stock !
    Remplissage du stock de 20 articles !
    Client 3 prend 3 du stock, reste 17 en stock !
    Client 2 prend 2 du stock, reste 15 en stock !
    Client 2 prend 4 du stock, reste 11 en stock !
    Client 3 prend 5 du stock, reste 6 en stock !
    Client 3 prend 2 du stock, reste 4 en stock !
    Client 2 prend 3 du stock, reste 1 en stock !
    Remplissage du stock de 20 articles !
    Client 4 prend 2 du stock, reste 18 en stock !
    Client 2 prend 4 du stock, reste 14 en stock !
    Client 4 prend 4 du stock, reste 10 en stock !
    Client 2 prend 3 du stock, reste 7 en stock !
    Client 2 prend 0 du stock, reste 7 en stock !

Discussions similaires

  1. [Système] erreur lors de l'execution
    Par jadoo dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2006, 20h37
  2. [3.2] Erreur lors de l execution
    Par magnus2005 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 28/07/2006, 10h33
  3. erreur lors de l'execution d'un .jar
    Par ToMs dans le forum Général Java
    Réponses: 3
    Dernier message: 28/04/2006, 11h56
  4. [Free Pascal] Erreur lors de l'éxecution. (exitcode = 106)
    Par phoebos dans le forum Free Pascal
    Réponses: 2
    Dernier message: 03/03/2006, 22h24
  5. Erreur lors de l'execution d'un script jsp
    Par tuxor dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 06/08/2004, 12h35

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