1. #1
    Invité régulier
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : décembre 2012
    Messages : 9
    Points : 6
    Points
    6

    Par défaut Utilisation de pthread_create avec plusieurs arguments

    Bonjour,
    je voudrai synchroniser entre deux thread qui font de simple calcules, le problème étant comment le père envoi au thread plusieurs arguments, plus précisément nous somme obliger de passer par une structure qui contient tous les arguments utilisé.

    le problème comment caster du void=> une structure, et la je me suis mis a crée mon propre langage C

    Voici 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
    #include <signal.h>
    #include <stdio.h>
    #include <math.h>
    #include <type.h>
    #include <unistd.h>
    #include <pthread.h>
     
    void *fils1(void *valeur){
    	int x1;
    	struct val{int a;int b;int c;int d};
    	val=(struct*) valeur;
    	x1=(-val.b-sqrt(val.d))/(2*val.a);
    	printf("Solution1 trouvée \n");
    	pthread_exit(x1);
    }
    void *fils2(void* struture){
    	int x2;
    	struct val{int a;int b;int c;int d};
    	val=(struct*) valeur;
    	x2=(-val.b-sqrt(val.d))/(2*val.a);
    	printf("Solution2 trouvée\n");
    	pthread_exit(x2);
    }
    int main(){
    	float d,x1,x2;
    	pthread_t p1,p2;
    	int val;
    	float solution1,solution2;
    	struct valeur{
    		int a;
    		int b;
    		int c;
    		int d;
    	};
    	while(1){
    		printf("Donnez la valeur de a\n");
    		scanf("%d",&valeur.a);
    		printf("Donnez la valeur de b\n");
    		scanf("%d",&valeur.b);
    		printf("Donnez la valeur de c\n");
    		scanf("%d",&valeur.c);
    		valeur.d=valeur.b*valeur.b-(4*valeur.a*valeur.c);
    		printf("delta D=%f\n",valeur.d);
     
    		if(d>=0){
     
    			pthread_create(&p1,NULL,*fils1,(void*)valeur);
    			pthread_create(&p1,NULL,*fils2,(void*)valeur);
     
    			pthread_join(&p1,solution1);
    			pthread_join(&p2,solution2);
     
    			printf("La Solution 1 X1= %f\nLa Solution 2 X2= %f\n",solution1,solution2);
    			}
    		else{
    			printf("Pas de Solution\n");
     
    		}
     
    return 0;
    }

  2. #2
    Membre habitué
    Inscrit en
    mars 2010
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 118
    Points : 134
    Points
    134

    Par défaut

    L'idiome a utilisé pour passer des paramètres a un thread 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
    #include <iostream>
     
    using namespace std;
     
    struct param
    {
    	int a;
    	int b;
    };
     
    void* f(void* arg)
    {
    	param* casted_arg = static_cast<param*>(arg);
    	cout << "a = " << casted_arg->a << " b = " << casted_arg->b << endl;
    	return NULL;
    }
     
    int main()
    {
    	pthread_t t;
    	param arg = {1, 4};
     
    	pthread_create(&t, NULL, f, static_cast<void*>(&arg));
    	pthread_join(t, NULL);
     
    	return 0;
    }

  3. #3
    Membre habitué
    Inscrit en
    mars 2010
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 118
    Points : 134
    Points
    134

    Par défaut

    Ou encore tu peux utiliser std::thread depuis C++11, ce qui te simplifiera le passage de paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <thread>
     
    using namespace std;
     
    int main()
    {
    	std::thread t{[](int arg1, int arg2){ cout << "arg1 = " << arg1 << " arg2 = " << arg2 << endl; }, 2, 4};
    	t.join();
     
    	return 0;
    }

  4. #4
    Invité régulier
    Homme Profil pro
    Inscrit en
    décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : décembre 2012
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    je te remercie backlash infiniment , ta solution semble être bonne, mais malheureusement je suis obliger de travailler avec le C et non pas C++, je me suis trompé de forum
    mais n’empêche, je peux toujours essayer de trouver l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    param* casted_arg = static_cast<param*>(arg);

  5. #5
    Membre habitué
    Inscrit en
    mars 2010
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 118
    Points : 134
    Points
    134

    Par défaut

    l'équivalent est le bon vieux cast classique du C.

  6. #6
    Expert Confirmé Sénior

    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2007
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : septembre 2007
    Messages : 1 894
    Points : 4 469
    Points
    4 469

    Par défaut

    Citation Envoyé par Red Sno Voir le message
    je te remercie backlash infiniment , ta solution semble être bonne, mais malheureusement je suis obliger de travailler avec le C et non pas C++, je me suis trompé de forum
    mais n’empêche, je peux toujours essayer de trouver l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    param* casted_arg = static_cast<param*>(arg);
    les static_cast<> n'existant pas en C, il faut bien évidemment utiliser un cast simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    param *casted_arg = (param*)arg;
    Ceci dit, en C99, ce n'est pas utile puisque arg est un void*, et que les void* sont casté implicitement. Du coup,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    param *real_arg = arg;
    est suffisant.

    (Idem, le cast vers void* est lui aussi implicite).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. [XL-2010] utiliser "If .Range("I" & f).Value <> 0 Then" avec plusieur arguments
    Par nunnu27 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 10/09/2010, 09h40
  2. Réponses: 1
    Dernier message: 03/06/2008, 10h21
  3. somme avec plusieurs arguments
    Par new_wave dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/05/2007, 19h12
  4. callback avec plusieurs arguments
    Par Claiw dans le forum GTK+
    Réponses: 2
    Dernier message: 23/12/2006, 18h46
  5. switch avec plusieurs arguments
    Par lazzeroni dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2006, 13h34

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