Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  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 : 5
    Points
    5

    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 :
    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 : 119
    Points
    119

    Par défaut

    L'idiome a utilisé pour passer des paramètres a un thread est le suivant :
    Code :
    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 : 119
    Points
    119

    Par défaut

    Ou encore tu peux utiliser std::thread depuis C++11, ce qui te simplifiera le passage de paramètre:
    Code :
    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 : 5
    Points
    5

    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 :
    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 : 119
    Points
    119

    Par défaut

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

  6. #6
    Expert Confirmé Sénior

    Homme Profil pro Emmanuel Deloget
    Développeur informatique
    Inscrit en
    septembre 2007
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Nom : Homme Emmanuel Deloget
    Âge : 38
    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 140
    Points
    4 140

    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 :
    param* casted_arg = static_cast<param*>(arg);
    les static_cast<> n'existant pas en C, il faut bien évidemment utiliser un cast simple :

    Code :
    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •