# C++ pthread\_create , souci avec les parramettres

**URL:** <https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791 "2016-02-21T12:27:43Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/1 "2016-02-21T12:27:43Z")

</div>

Hello

J’ai un petit problème avec le code suivant:

[code]  
#include “pthread.h”  
#include   
#include \<stdio.h\>  
#include \<stdlib.h\>  
volatile char theChar = ‘\0’;  
volatile char afficher = 0;

void\* lire ()  
{  
do {  
while (afficher == 1) ; /\* attendre mon tour _/  
theChar = getchar();  
afficher = 1; /_ donner le tour \*/  
} while (theChar != ‘F’);

```
return NULL;

```

}

void\* affichage ()  
{  
int cpt = 0;  
do {  
while (afficher == 0) cpt ++; /\* attendre _/  
std::cout \<\< "Thread " \<\< std::endl;  
afficher = 0; /_ donner le tour \*/  
}  
while (theChar != ‘F’);  
return NULL;  
}

int main (void)  
{  
pthread\_t filsA, filsB;  
//std::string SendA= “AA”;  
//std::string SendB= “BB”;  
if (pthread\_create(& filsA, NULL, affichage,NULL)) {  
perror(“pthread\_create”);  
exit(EXIT\_FAILURE);  
}  
if (pthread\_create(&filsB, NULL, lire,NULL)) {  
perror(“pthread\_create”);  
exit(EXIT\_FAILURE);  
}

```
if (pthread_join(filsA, NULL))
    perror("pthread_join");

if (pthread_join(filsB, NULL))
    perror("pthread_join");

printf("Fin du pere\n") ;
return (EXIT_SUCCESS);

```

}  
l’erreur:

```auto
main.cpp:36: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
main.cpp:40: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
```

j’ai mis NULL pour que le message d’erreur soie plus explicit, avidement si je met une valeur qui … va servir a rien  
Cela va donner un avertissent comme quoi la variable ne sera pas utilisée a la compilation.  
si je met une variable il faut qu’elle soie passer par référence. ensuite dans la fonction je doit m’en servir pour ne rien faire…

une idée pour que je me passe de la variable et que cela ne “miaule” pas ?  
ou une autre manière de faire peut être ?

Je compile avec g++ pour du c++  
je me suis inspirer de la page suivate:  
[jean-luc.massat.perso.luminy.uni … hread.html](http://jean-luc.massat.perso.luminy.univmed.fr/ens/docs/thread.html)  
j’ai trouver de la doc ici  
[mtodorovic.developpez.com/linux/ … age\_4#L4-1](http://mtodorovic.developpez.com/linux/programmation-avancee/?page=page_4#L4-1)

Merci d’avance

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/2 "2016-02-21T12:27:43Z")

</div>

Tes fonctions de thread (lire() et affichage()) doivent prendre un argument de type void\* pas le choix :

`void* lire(void*) {
  // ...
}`

> [@panthere](#):
>
> Cela va donner un avertissent comme quoi la variable ne sera pas utilisée a la compilation.

Si tu ne donnes pas de nom à l’argument (exactement comme j’ai marqué au dessus quoi) je crois que ça ne devrait pas râler.

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/3 "2016-02-21T12:27:44Z")

</div>

Merci pour ta réponse. Le C et les pointeur c’est pas évident. ![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!")

d’ailleurs void \* sa veux dire quoi exactement?

rien qui pointe sure un élément inconnu ?? (pour moi le mots void = rien)

j’ais juste ?

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/4 "2016-02-21T12:27:44Z")

</div>

Utilisé tout seul (en retour de fonction) void = rien, effectivement.  
Par contre void\* signifie : un pointeur vers un type inconnu (et il faudra forcément utiliser un cast avant de déréférencer la variable).

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/5 "2016-02-21T12:27:44Z")

</div>

je suppose que si on passe une structure il n’y a pas lieux de faire un cast ?

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/6 "2016-02-21T12:27:44Z")

</div>

La conversion de type\* vers void\* se fait automatiquement sans cast, mais la conversion de void\* vers type\* nécessite un cast. Structure ou pas ça ne change rien.

[code]void\* fonction(void\* arg) {  
//…  
}

int main() {  
int var = 1;  
int\* ptr1 = &var;  
int\* ptr2 = (int\*)fonction(ptr1); // et non pas (int\*)fonction((void\*)ptr1);  
//…  
}[/code]

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/7 "2016-02-21T12:27:44Z")

</div>

Oki Piger , bon reste a pratiquer histoir de pas perdre de vu ce qui a été dit .  
Merci pour tes réponses ![:handgestures-thumbup:](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "Thumb Up")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/8 "2016-02-21T12:27:46Z")

</div>

Juste pour mettre mon grain de sel.

```auto

```

Ce n’est pas nécessaire, mais ça n’est pas interdit non plus. Ça peut être utile de rendre les conversions visibles dans le code.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 12:27 UTC](https://www.debian-fr.org/t/c-pthread-create-souci-avec-les-parramettres/53791/9 "2016-02-21T12:27:46Z")

</div>

[quote=“MisterFreez”]`int* ptr2 = (int*)fonction(ptr1); // et non pas (int*)fonction((void*)ptr1);`  
Ce n’est pas nécessaire, mais ça n’est pas interdit non plus.[/quote]  
Ça dépend si on parle de C ou de C++. 😉  
En C effectivement tu n’as pas besoin de faire un cast explicite de void\* vers type\* (j’avoue, ça m’était complètement sorti de la tête) mais en C++ il faut obligatoirement faire un cast.

g++ confirme, en me sortant l’erreur suivante :

```auto

```

Et si on va voir dans le man de gcc pour l’option -fpermissive, ça confirme à nouveau qu’on est face à du code non conforme (bien qu’avec l’option -fpermissive gcc puisse n’émettre qu’un warning au lieu de l’erreur que le standard C++ requiert).
