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 :

correction d'un code


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut correction d'un code
    Bonjour,
    Qui peut m'aider a corriger ce code. Le probleme que seul le 3 eme thread fonctionne et ce pendant juste quelques instants !!
    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
    #define _GNU_SOURCE
    #include <pthread.h>
    #include <stdio.h>
    #include <sched.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/time.h>
    #define PTU 2000           // 2ms
    #define HIGHEST_PRIORITY 99
    typedef struct milcan_data
    {
    	int sync ;
    	int slave_ID;
    }milcan_data;
     
    struct milcan_data milcan_arg;
     
    void *slave_func(void *slave_data)
    {
    	int j;
    	struct milcan_data * slave_signals= (struct milcan_data *)slave_data;
    	while(1)
    	{
    			usleep(2000000+(100*(slave_signals->slave_ID)));
    			slave_signals->sync++;
    			fprintf(stdout,"slave (%d) is talking the current sync is (%d) \n",slave_signals->slave_ID,slave_signals->sync);
    	}
    	return(NULL);
    }
     
    int main ()
    {
    	int val,i,j;
    	int err;
    	struct sched_param param_processus;
    	struct sched_param param_slave_thr ;
    	pthread_attr_t slave_attr;
    	/////////////////     AFFECTATION PRIORITE TEMPS REEL FIFO
    	param_processus.sched_priority = HIGHEST_PRIORITY;
    	if (sched_setscheduler(0, SCHED_FIFO, &param_processus) != 0)
    	{
    		perror("processus sched_setscheduler");
    		exit(EXIT_FAILURE);
    	}
    	/////////////////     PREPARATION DES ATTRIBUTS DU SLAVE_THREAD
    	pthread_attr_init(&slave_attr);
     
    	if ((err=pthread_attr_setschedpolicy(&slave_attr,SCHED_RR))!=0)
    	{
    		fprintf(stderr,"setschedpolicy slave thread: %s\n",strerror(err));
    		exit(EXIT_FAILURE);
    	}
    	if ((err=pthread_attr_setinheritsched(&slave_attr,PTHREAD_EXPLICIT_SCHED))!=0)
    	{
    		fprintf(stderr,"setinheritshed slave thread: %s\n",strerror(err));
    		exit(EXIT_FAILURE);
    	}
     
    	param_slave_thr.sched_priority = HIGHEST_PRIORITY;
     
    	if ((err=pthread_attr_setschedparam(&slave_attr,&param_slave_thr))!=0)
    	{
    		fprintf(stderr,"setschedparam slave thread: %s\n",strerror(err));
    		exit(EXIT_FAILURE);
    	}
    	///////////////////////////////////////////////////// PREPARATION MILCAN_DATA
    	pthread_t slave_thr[3];
    	milcan_arg.sync = 0;
     
    	/////////////////////   EXECUTION DES THREAD
    	for ( i=0;i<3;i++)
    	{
    		milcan_arg.slave_ID=i+1;
     
    		if((err=pthread_create(&slave_thr[i],NULL,slave_func,&milcan_arg)!=0))
    		{	
    			fprintf(stderr,"can't create slave thread %s \n",strerror(err));
    			exit(EXIT_FAILURE);
    		}
    	}
    	// ATTENTE DE TOUS LES THREAD
    	for ( i=0;i<3;i++)
    	{
    		pthread_join(slave_thr[i], NULL);	
    	}
    	return 0;
     
     
     
     
    }
    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
    [makavelli@fibonacci my_RT_codes ]$ gcc -w  -lpthread -lrt -o testtaksirkrayem test_sched.c -Wall
    [makavelli@fibonacci my_RT_codes ]$ taskset -c 3 sudo ./testtaksirkrayem
    slave (3) is talking the current sync is (1) 
    slave (3) is talking the current sync is (2) 
    slave (3) is talking the current sync is (3) 
    slave (3) is talking the current sync is (4) 
    slave (3) is talking the current sync is (5) 
    slave (3) is talking the current sync is (6) 
    slave (3) is talking the current sync is (7) 
    slave (3) is talking the current sync is (8) 
    slave (3) is talking the current sync is (9) 
    slave (3) is talking the current sync is (10) 
    slave (3) is talking the current sync is (11) 
    slave (3) is talking the current sync is (12) 
    slave (3) is talking the current sync is (13) 
    slave (3) is talking the current sync is (14) 
    slave (3) is talking the current sync is (15) 
    ^C[makavelli@fibonacci my_RT_codes ]$ ^C
    [makavelli@fibonacci my_RT_codes ]$

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    en lisant en diagonal je remarque que tu passes le même milcan_arg à tous tes threads ... comme la dernière modif sur cette variable met 3 dans milcan_arg.slave_ID, tous les threads imprimeront 3.
    Je n'ai pas regardé plus en profondeur cependant.

    EDIT: rajoute l'affichage de pthread_self() dans la fonction slave ... tu verras que tu as bien 3 threads qui tournent.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    Merci c'est honteux de ne pas le voir

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    Citation Envoyé par kwariz Voir le message
    en lisant en diagonal je remarque que tu passes le même milcan_arg à tous tes threads ... comme la dernière modif sur cette variable met 3 dans milcan_arg.slave_ID, tous les threads imprimeront 3.
    Est ce que tu peux me proposer comment faire pour que chaque thread aura son propre structure sachant que j'ai des variables gobales comme le sync et que je suis obligé de declarer une seule structure parceque la declaration des thread nous obligent a passer un seul argument a la fonction.

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Tu veux donc que tous les threads aient le même sync mais un slave_id différent. Une solution peut être en modifiant ta struct milcan_data ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct milcan_data {
      int* psync; // on a plus qu'un pointeur sur sync
      int slave_id;
    }
    de rajouter une variable globale (c'est pas obligé mais par simplicité on va faire comme ça dans un premier temps) :
    puis dans ton main tu déclares un tableau de struct milcan_data (comme ton tableau de pthread_t) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct milcan_data[3]= {
      {&sync, 0},
      {&sync, 1},
      {&sync, 2}
    };
    et quand dans ta boucle tu passes les paramètres aux threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create(&slave_thr[i],NULL,slave_func,&milcan_arg[i])
    C'est une manière de faire, et pour expliquer simplement on peut dire : une structure qui regroupe tous les paramètres, autant de structures que de threads, dans la structure ce qui est "local" au thread est simplement un champs, ce qui peut-être partagé entre les threads un champs qui pointe vers la donnée partagée.
    N'oublie pas non plus que les variables globales sont vues par les threads ... tu peux directement accéder à la variable sync dans un thread si sync est globale ...
    Avec la méthode de "je passe un pointeur" tu peux rendre ta variable sync locale à main par exemple.

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    Merci c'est bien expliqué, juste je me demande, pour ton exemple, c'est sync qui est differente d'un thread a l'autre et non pas slave_ID n'est ce pas ? si non si je me trompe ce qu'on fait c'est "distribuer" sync a tous les threads ? En plus, si c'est le cas comment faire si on plus qu'une variable a partagée et une seule locale ?? par exemple pour cet exemple je veux juste que slave_ID sera differents pour chaque thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct milcan_data
    {
    	int nodes_nbr;
    	int sync ;
    	char *schedule_table[NBR_CYCLE][NBR_TRAME];
    	int using_priority_sched;
    	int master_ID;
    	int slave_ID
     
     
    }milcan_data;

  7. #7
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Tout sera peut-être plus clair avec un schéma :


    Chaque thread a un pointeur vers un élément de milcan_data[], chaque élément de milcan_data regroupe un entier et un pointeur qui par initialisation pointe vers la même variable globale.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin de correction dans un code
    Par juliendu67 dans le forum jQuery
    Réponses: 8
    Dernier message: 01/12/2009, 13h06
  2. Réponses: 6
    Dernier message: 13/06/2009, 21h48
  3. correction d un code en vb.net
    Par vbnetnet dans le forum VB.NET
    Réponses: 4
    Dernier message: 28/04/2009, 13h28
  4. Correction de mon code [Débutant]
    Par Calvein dans le forum C#
    Réponses: 12
    Dernier message: 13/06/2008, 07h28
  5. Correction de mon code vba svp
    Par njinkeu.mbakob dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/04/2008, 12h21

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