Classe Thread (ca marche) [C++] - C++ - Programmation
Marsh Posté le 28-01-2004 à 23:22:31
jète tout et passe par là -> boost.org
en plus c'est C++ orienté objet, un régal
Marsh Posté le 28-01-2004 à 23:28:26
Oui j'y ai fortement pensé... mais je voulais tenter de comprendre par moi même.
D'ailleurs, je n'ai pas encore capté comment on exploite boost::, les sources sont ils disponibles ou faut il necessairement passer par leurs packages et leur outil de "compilation" (je ne sais meme pas le nommer).
Merci.
XteR.
Marsh Posté le 28-01-2004 à 23:33:24
non, les bordels compilés sont disponibles sur 2 nombreux systèmes.
Marsh Posté le 29-01-2004 à 08:39:26
La nuit porte conseil ! Mon code tourne parfaitement sous GNU/Linux a condition de demander explicitement de linker avec POSIX Thread.... (hum! pas sérieux ca!)
Remarque : Par contre, je me demande toujours pourquoi pthread_create() est linkable sans la librairie POSIX (pthread.h). Ou est-elle déclarée ailleurs ? Pourquoi est-elle buggée en plus ?
Passons, je vais qd même essayer de comprendre boost.
Merci,
Xter.
Marsh Posté le 29-01-2004 à 08:58:22
bon, j'ai viré la partie win32 qui ne m'interresse pas.
le code suivant fonctionne.
ALors c'est vrai que boost c'est bien, mais le module de thread ne va pas forcément à tout le monde. Notemment, la fonction executée dans le thread n'est pas une fonction membre, et le mécanisme que xterminhate met en place avec la fonction virtuelle pure est sympathique, et va au dela de ce qui est proposé par boost.
Enfin, même si c'est bien de ne pas réinventer le moteur a explosion, certains ont quand même envie de comprendre comment cela se passe. Et dans ces cas, mettre les mains dedans c'est bien aussi.
Bon, sinon si tu as des pb de link, c'est que ta lib doit être foireuse. normalement, seul un -lpthread devreait suffir.
Code :
|
Marsh Posté le 29-01-2004 à 11:10:54
oui mais c'est pourri comme code et ça fout en l'air les invariants du C++. tu peux te gratter pour tes destructeurs, autant carrémen tplus les écrire
x_MaClasse monTemps10 = x_MaClasse(-10);
t'es sur que tu connais pas plus simple comme syntaxe ?
« // ...et pour la forme (hein?)
return 0; »
inutile
Marsh Posté le 29-01-2004 à 11:31:00
> oui mais c'est pourri comme code
bien d'accord avec cet argument. Mais avant de passer à du code pondu par qq1 d'autre, c'est quand même bien de comprendre pourquoi ce qu'on a fait ne fonctionne pas, non? C'est frustrant de passer à autre chose sans avoir compris la cause des problèmes (qu'on est donc succeptible de reproduire par la suite).
Marsh Posté le 29-01-2004 à 11:37:47
le problème n'est pas là. c'est une approche C avec du C++. tu prends n'importe quelle implémentation de thread dans un langage objet (C++ pour nous), tout est emballé dans des classes.
Marsh Posté le 29-01-2004 à 12:45:41
SoWhatIn22, je vois que tu as simplifié ma petite classe Thread. Je comptais le faire aussi et de cette façon là, mais je constaste que tu m'a pris de vitesse. Initialement, la fonction static ::filament se situait dans la classe, tu as corrigé de toi même, parfait.
Ce code avait un objectif pédagogique et je souhaite l'améliorer. Je suis prenneur de toutes observations constructives pour faire les améliorations qu'il convient.
Je regarde le code Thread.cpp de boost en comparaison, mais je ne pense pas utiliser directement boost (dans un premier temps) car c'est une librairie 'globale' dont 99% des fonctionnalités ne me sont pas utiles à l'heure actuelle.
Concernant le probleme des destructeurs... et bien je vais y regarder de plus pres. Jusqu'a maintenant, ce n'etait pas mon soucis principal.
Cordialement,
Xter.
Marsh Posté le 29-01-2004 à 12:56:10
bah c'est toi qui voit, c'est toi qui supporte un mauvais design et ses problèmes. À au fait, n'utilise pas STL, parce que là t'es à 1% d'utilisation, ça vaut pas la peine
Marsh Posté le 29-01-2004 à 14:22:19
SoWhatIn22 a écrit : |
bin l'enorme avantage de la 'fonction' a executer par le thread chez boost et que ca peut etre un fonctor, on peut utiliser boost::bind pour utiliser des objets, tu peux envoyer une fonction avec des paramètres aussi.
puis rien ne t'empeche (il me semble ?) de dériver boost::thread pour pouvoir limiter l'utilisation à une méthode du fils comme ici.
sinon, la plupart des fontionnalités de boost s'ont pas besoin d'être compilées séparement, à 2-3 exceptions pres, boost::thread en fait partie. pour faciliter la compilation il existe l'utilitaire bjam.
edit : ca fait pas trop propagande ?
Marsh Posté le 29-01-2004 à 14:23:47
bien dit. ce qui m'emmerde un peu, c'est que vous comprenez pas ce qu'implique de mixer du C avec du C++ : plus d'expcetion (si y en a une qui parre, c'est le plantage assuré), les destructeur ne sont pas appelés (risque de ne pas libérer des ressources, mais bien plus embêtant que la ram, ne pas libérer un mutex)
sinon je comprends rien : tu gueules parce qu'il faut passer par une classe, mais c'est toi qui fait une classe
et thread, ça se traduit pas par filament, mais tout simplement par « fil d'exécution »
Marsh Posté le 29-01-2004 à 15:07:55
> thread, ça se traduit pas par filament, mais tout simplement par « fil d'exécution »
tu vas un peu vite en besogne. Dans les mensuels (les journaux, quoi, genre LMF, Login, et autres), ca se traduit par "brin", "filament", "fil", et encore d'autres. De la possibilité de pouvoir choisir ... ("tous des cons", c'est ça?)
pour le reste, je lâche l'affaire...
Marsh Posté le 29-01-2004 à 15:10:34
tous des cons. un thread en anglais, dans cet emploi, ne fais pas référence à de la couture ou autre chose, ce qui est important c'est l'exécution
Marsh Posté le 29-01-2004 à 19:06:39
Citation : le problème n'est pas là. c'est une approche C avec du C++. |
J'admets que la conception de ma classe Thread n'est pas 'top' (pas non plus 'bottom', enfin j'espere ). En outre, il faut reconnaitre également que les appels POSIX sont en pur C...
Citation : ...au fait, n'utilise pas STL, parce que là t'es à 1% d'utilisation, ça vaut pas la peine |
Ca m'apprendra a sortir des arguments à la con! Même si seulement 1% de boost me concerne, cela ne devrait pas m'empecher de l'exploiter.
Citation : sinon, la plupart des fontionnalités de boost s'ont pas besoin d'être compilées séparement, à 2-3 exceptions pres, boost::thread en fait partie. pour faciliter la compilation il existe l'utilitaire bjam. |
Effectivement, thread.cpp se compile tout seul (quasiment)! D'ailleurs, je continue d'investiguer le code de Boost::Thread. Par contre, il me jette à la compilation (surement un pb de configuration des .H dédiés à la configuration de la plateforme).
Citation : et thread, ça se traduit pas par filament, mais tout simplement par « fil d'exécution » |
A partir du moment ou tout le monde se comprend, je pense que chacun est libre d'utiliser la traduction qui lui plait le plus plaisir. C'est bien a ça que sert le langage n'est ce pas...
Merci pour vos commentaires sur ma classe, je tente de l'améliorer tout en gardant une approche pédagogique.
Xter.
PS: Et arretez de vous insulter ! C'est sûr, nous n'avons pas tous le même niveau en programmation... c'est qd même pas bien grave surtout si la volonté de progresser est là !
Marsh Posté le 29-01-2004 à 19:30:30
Je persiste à dire qu'utiliser les pthread en C++ de cette manière, c'est aller droit dans le mur. aurevoir
Marsh Posté le 29-01-2004 à 22:28:22
Je viens de parcourir un peu plus en détail le code source de boost:thread. C'est un fait : l'"emballage" est nettement mieux fait dans boost.
Reste bien assis Taz, parce que sincèrement je ne vois pas de différence fondamentale entre mon code et celui de boost. Ou alors, c'est vraiment subtile! Avant de m'insulter en ligne (sic!), je continue mon investigation, sait-on jamais
Cordialement,
Xter.
Marsh Posté le 30-01-2004 à 00:32:30
Je finalise et je te transmets le code.
Par ailleurs, je commence à comprendre! Par exemple, un constructeur par recopie n'a aucun sens avec ma classe Thread alors que dans boost::Thread ca marche impec. Cette dernière respecte en effet la conception OO.
On va dire que ma classe s'utilise différement...
Cordialement,
Xter.
Marsh Posté le 30-01-2004 à 01:52:03
J'en suis arrivé là. Je conserve mon interface (non c++) du début. Je me suis inspiré du code de boost et d'autres librairies. Ca vaut ce que ca vaut. Si vous trouvez un bug, signalez le moi. Merci.
Cordialement,
Xter.
Les librairies...
Code :
|
La classe...
Code :
|
Les implémentations....
Code :
|
Marsh Posté le 30-01-2004 à 04:50:05
Bon j'ai tenté d'ajouter une ptite surcouche C++ à ma classe x_Filament. Je l'appelle x_Filament_Ameliore et elle prend en argument un functor....
Code :
|
Marsh Posté le 30-01-2004 à 05:03:17
Je me demande pourquoi je m'ennuis... je retombe exactement sur boost....
Marsh Posté le 30-01-2004 à 12:32:53
En m'inspirant fortement de LMF janvier 2004, voila ce que pourrait donner une adaptation C++ de ma classe thread.
Code :
|
Quant à l'utilisation, c'est extremement bourin mais ca permet d'executer en filament n'importe quelle fonction membre de n'importe quelle classe (à condition de la fonction membre retourne void). De ce genre...
Code :
|
Code :
|
Cordialement,
Xter.
Marsh Posté le 30-01-2004 à 12:47:38
Je me demande ce qu'il se passe si le destructeur de la classe foo est appelé avant la fin de l'execution du filament( qui execute void foo() )... hum!
Marsh Posté le 30-01-2004 à 16:38:49
xterminhate a écrit : Par exemple, un constructeur par recopie n'a aucun sens avec ma classe Thread alors que dans boost::Thread ca marche impec. Cette dernière respecte en effet la conception OO. |
bin ... boost::thread hérite de boost::noncopyable, ce qui empêche l'objet d'etre copié, ce qui n'a effectivement aucun sens dans le cas d'un thread
Marsh Posté le 30-01-2004 à 17:28:35
Tout a fait, boost empeche l'utilisateur ne faire n'importe quoi avec la classe boost::Thread une fois instanciée... Par curiosité il faudra que je jete un coup d'oeil furtif dans la description de boost:noncopyable histoire de voir comment elle marche. Apparement tu as l'air assez friand de cette classe d'apres ce que j'ai pu constaté
Merci,
Xter.
Marsh Posté le 31-01-2004 à 03:40:07
lool oui, bin c'est pratique je trouve en effet
puis elle est super simple cette classe : elle se contente de déclarer le constructeur de copie et l'operateur d'assignation en privée
Marsh Posté le 01-02-2004 à 21:01:34
Pour en terminer avec ce post, le code source de mon thread c++ est disponible à l'adresse suivante.
http://www.cppfrance.com/code.aspx?ID=19908
Je ferai probablement des mises à jour pour améliorer ou corriger ce code.
Cordialement,
XteR.
Marsh Posté le 28-01-2004 à 23:21:15
-edit-
RESOLU
Je réinvente la roue ! Je code une classe C++ qui encapsule les threads POSIX. Ca fonctionne bien sous Win32(MinGW) mais ca plante complètement sous Linux(g++).
RESOLU
-edit-
-edit-
Ne pas oublier de liker explicitement avec pthread.
-edit-
Voici le code:
-edit-
RESOLU
Sous GNU/Linux, voici les problemes :
- Segmentation Fault au passage de l'instruction pthread_create(...).
- Impossible de linker certaines fonctions de pthread (pthread_join/detach entre autres).
RESOLU
-edit-
Merci d'avance pour vos conseils eclairés.
Cordialement,
Xter.
Message édité par xterminhate le 01-02-2004 à 21:02:20