OVH Cloud OVH Cloud

Pb de Threads

24 réponses
Avatar
Bonnel Maxime
Bonjour,
en écrivant le code suivant :

#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
void print_mess(void *ptr)
{
char * message;
message = (char *)ptr;
printf("%s",message);
pthread_exit(0);
}
int main (int argc,char *argv[])
{
pthread_t thread_h;
char m_h[] = "Hello ";
pthread_create(&thread_h,NULL,(void *) &print_mess, (void *) m_h);
return 0;
}

J'obtient à la compilation l'erreur suivante:

thread.cc:24: conversion invalide de « void* » vers « void*(*)(void*) »

Cette erreur provient du dernier paramètre de pthread_create il semblerait
mais je ne sais pas pourquoi

Merci pour votre aide
@+

10 réponses

1 2 3
Avatar
Christophe de VIENNE
Salut,

Ta question est hors-sujet : sur ce forum on parle du langage c++, et ce
que tu nous montre est du C, et qui plus est concerne une bibliothèque
de fonction non-standard du point de vue du langage.

<HS>
Cela dit, essayes :
pthread_create(&thread_h,NULL,&print_mess, (void *) m_h);

et lis bien le manuel de pthread (sous unix tapes "man pthread_create")
</HS>

Si t'as d'autre questions diriges-toi vers un forum approprié :
fr.comp.lang.c pour tes questions sur le langage, un forum parlant de
posix ou bien unix à la rigueur concernant posix thread.

A+

Christophe
Avatar
Cyrille Karmann
Christophe de VIENNE disait...
Salut,

Ta question est hors-sujet : sur ce forum on parle du langage c++, et ce
que tu nous montre est du C, et qui plus est concerne une bibliothèque
de fonction non-standard du point de vue du langage.


Juste une question à ce propos: si ç'avait été un problème non pas avec
les threads posix mais avec les threads de boost, est-ce que ça aurait
eu sa place ici?

--
Cyrille
Euro 2004: Santini delenda est.

Avatar
Bonnel Maxime

Christophe de VIENNE disait...
Salut,

Ta question est hors-sujet : sur ce forum on parle du langage c++, et ce
que tu nous montre est du C, et qui plus est concerne une bibliothèque
de fonction non-standard du point de vue du langage.


Juste une question à ce propos: si ç'avait été un problème non pas avec
les threads posix mais avec les threads de boost, est-ce que ça aurait
eu sa place ici?


Eh bien alors quelqu'un peut il alors m'indiquer une librairie standar
pour les Thread en C++ ???


Avatar
Cyrille Karmann
Bonnel Maxime disait...

Christophe de VIENNE disait...
Salut,

Ta question est hors-sujet : sur ce forum on parle du langage c++, et ce
que tu nous montre est du C, et qui plus est concerne une bibliothèque
de fonction non-standard du point de vue du langage.


Juste une question à ce propos: si ç'avait été un problème non pas avec
les threads posix mais avec les threads de boost, est-ce que ça aurait
eu sa place ici?


Eh bien alors quelqu'un peut il alors m'indiquer une librairie standar
pour les Thread en C++ ???


Il n'y a rien dans la librairie standard du C++ sur les threads.

Mais il y a une librairie portable et pas mal utilisée, qui s'intègre
bien avec la librairie standard, et qui est celle dont je parlais,
c'est-à-dire boost. Parmis les zilliards de choses qu'elle propose, il y
a les threads.

Voir http://www.boost.org

--
Cyrille
Euro 2004: Santini delenda est.



Avatar
Loïc Joly
Cyrille Karmann wrote:
Christophe de VIENNE disait...

Salut,

Ta question est hors-sujet : sur ce forum on parle du langage c++, et ce
que tu nous montre est du C, et qui plus est concerne une bibliothèque
de fonction non-standard du point de vue du langage.



Juste une question à ce propos: si ç'avait été un problème non pas avec
les threads posix mais avec les threads de boost, est-ce que ça aurait
eu sa place ici?


Mon avis, c'est qu'une discussion sur les mérites comparés de
boost::thread et d'autre chose, une discussion sur une technique
utilisée par boost::thread, ou même une réponse : "Pour ton problème, il
y a boost::thread" sont tous des sujets en thème sur ce newsgroup.

Et je dirais la même chose pour les threads posix (même s'il y a
certainement moins de discussions intéressantes dessus, point de vue
C++) qui sont elles aussi un standard.

De même pour toute autre bibliothèque de thread, mais à condition alors
qu'on donne plus de contexte pour comprendre la discussion.

Par contre, je serais plus dubitatif sur des discussions sur comment
utiliser pthread_exit ou boost::condition::timed_wait, et plutôt hostile
sur des discussion autour des performances des threads sur tel ou tel OS.

Comme quoi, ce n'est pas toujours une limite très claire.

--
Loïc


Avatar
kanze
"Bonnel Maxime" wrote in message
news:...

en écrivant le code suivant :

#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>

void
print_mess(void *ptr)
{
char * message;
message = (char *)ptr;
printf("%s",message);
pthread_exit(0);
}

int
main (int argc,char *argv[])
{
pthread_t thread_h;
char m_h[] = "Hello ";
pthread_create(&thread_h,NULL,(void *) &print_mess, (void *) m_h);
return 0;
}

J'obtient à la compilation l'erreur suivante:

thread.cc:24: conversion invalide de « void* » vers « void*(*)(void*) »

Cette erreur provient du dernier paramètre de pthread_create il
semblerait mais je ne sais pas pourquoi.


Alors, qu'est-ce qui te fait penser qu'elle vient du dernier paramètre ?
(En fait, elle provient de l'avant dernier.)

Surtout, pourquoi les conversions explicites ? En général, la seule fois
où il doit te falloir une conversion explicite dans l'appel d'une
fonction, c'est quand tu passes un pointeur nul à un var args. Puisque
pthread_create n'est pas une fonction var_args, s'il te faut une
conversion explicite dans son appel, c'est qu'il y a quelque chose de
louche dans ton code. Et en fait, si tu enlèves les conversions
explicites de l'appel, ton code doit marcher.

(Enfin, dans le cas l'API Posix, il y a des exceptions, ou Posix utilise
un void* pour contenir un pointeur à une fonction. Mais ce n'est pas le
cas avec pthread_create, et vue qu'en C/C++ standard, il n'y a aucune
possibilité de faire la conversion, implicite ou explicite, il faut
utiliser une extension du compilateur de toute façon. Extension qui
prendrait logiquement la forme, en C++, d'accepter un reinterpret_cast
là où la norme l'interdit.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
kanze
Cyrille Karmann wrote in message
news:...
Christophe de VIENNE disait...

Ta question est hors-sujet : sur ce forum on parle du langage c++,
et ce que tu nous montre est du C, et qui plus est concerne une
bibliothèque de fonction non-standard du point de vue du langage.


Juste une question à ce propos: si ç'avait été un problème non pas
avec les threads posix mais avec les threads de boost, est-ce que ça
aurait eu sa place ici?


Certainement. De même que si la question concerne les règles qui
s'appliquent aux conversions implicites et explicites de types, même si
par hazard la fonction en question fait partie de l'API Windows ou
Posix. La question posée n'était pas hors-sujet, quoiqu'on dise
Christophe.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
kanze
Cyrille Karmann wrote in message
news:...
Bonnel Maxime disait...

Christophe de VIENNE disait...

Ta question est hors-sujet : sur ce forum on parle du langage
c++, et ce que tu nous montre est du C, et qui plus est concerne
une bibliothèque de fonction non-standard du point de vue du
langage.


Juste une question à ce propos: si ç'avait été un problème non pas
avec les threads posix mais avec les threads de boost, est-ce que
ça aurait eu sa place ici?


Eh bien alors quelqu'un peut il alors m'indiquer une librairie
standar pour les Thread en C++ ???


Il n'y a rien dans la librairie standard du C++ sur les threads.

Mais il y a une librairie portable et pas mal utilisée, qui s'intègre
bien avec la librairie standard, et qui est celle dont je parlais,
c'est-à-dire boost. Parmis les zilliards de choses qu'elle propose, il
y a les threads.

Voir http://www.boost.org


Le problème, c'est que les threads concernent aussi le langage, et non
seulement la bibliothèque. Boost définit bien une API portable (et
Dinkumware travaille avec eux pour s'assurer que l'API de sa
bibliothèque soit compatible), mais il ne peut pas définir le
comportement du compilateur. Il faut donc quand même se renseigner
auprès du fournisseur (et les informations sont souvent très difficile à
avoir).

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16




Avatar
kanze
Loïc Joly wrote in message
news:<bq306o$mkv$...

Cyrille Karmann wrote:
Christophe de VIENNE disait...

Ta question est hors-sujet : sur ce forum on parle du langage c++,
et ce que tu nous montre est du C, et qui plus est concerne une
bibliothèque de fonction non-standard du point de vue du langage.


Juste une question à ce propos: si ç'avait été un problème non pas
avec les threads posix mais avec les threads de boost, est-ce que ça
aurait eu sa place ici?


Mon avis, c'est qu'une discussion sur les mérites comparés de
boost::thread et d'autre chose, une discussion sur une technique
utilisée par boost::thread, ou même une réponse : "Pour ton problème,
il y a boost::thread" sont tous des sujets en thème sur ce newsgroup.

Et je dirais la même chose pour les threads posix (même s'il y a
certainement moins de discussions intéressantes dessus, point de vue
C++) qui sont elles aussi un standard.


Elles sont peut-être un standard, mais elle ne sont pas C++.

Le problème, c'est qu'il y a bon nombre de questions générales sur les
threads qui ne peuvent se discuter que sur la base d'une spécification
précise. Dans ces cas-là, je prends les threads Posix, à titre
d'exemple, parce que ce sont les seules que je connais, mais aussi parce
que leur spécification est facilement accessible à tout le monde. Je
suppose qu'il y a une spécification des threads Windows aussi quelque
part, mais jusqu'ici, je n'ai pas réussi à le trouver.

Ce qui ne veut pas dire qu'une discussion sur les détails de l'API Posix
peut avoir lieu ici.

De même pour toute autre bibliothèque de thread, mais à condition
alors qu'on donne plus de contexte pour comprendre la discussion.

Par contre, je serais plus dubitatif sur des discussions sur comment
utiliser pthread_exit ou boost::condition::timed_wait, et plutôt
hostile sur des discussion autour des performances des threads sur tel
ou tel OS.

Comme quoi, ce n'est pas toujours une limite très claire.


Tout à fait. Et que la règle générale, sait que dans la doute, c'est
acceptable.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
Christophe de VIENNE
wrote:
La question posée n'était pas hors-sujet, quoiqu'on dise Christophe.


Ah bon. Désolé Maxime !

A+

Christophe

1 2 3