 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
gg Guest
|
Posted: Tue Oct 24, 2006 12:40 am Post subject: Threads |
|
|
Bonjour,
Je souhaiterais savoir comment peut-on implémenter des threads en C++ de
façon assez simple, et que le tout reste multi-plateforme ?
merci bien,
gg |
|
| Back to top |
|
 |
loufoque Guest
|
Posted: Tue Oct 24, 2006 2:54 am Post subject: Re: Threads |
|
|
gg a écrit :
| Quote: | Je souhaiterais savoir comment peut-on implémenter des threads en C++ de
façon assez simple, et que le tout reste multi-plateforme ?
|
Utilise boost.thread |
|
| Back to top |
|
 |
Dominique Vaufreydaz Guest
|
Posted: Tue Oct 24, 2006 9:12 am Post subject: Re: Threads |
|
|
Bonjour,
| Quote: | Je souhaiterais savoir comment peut-on implémenter des threads en C++
de façon assez simple, et que le tout reste multi-plateforme ?
|
Il y a en plus de boost :
- commoncpp2 qui fait ca
- la couche system de mon middleware OMiSCID
- pleins d'exemples sur le Web surtout si tu ne veux que des threads
et pas toute une floppée de classes.
Doms. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Tue Nov 14, 2006 10:54 pm Post subject: Re: Threads |
|
|
Venus²² wrote:
| Quote: | "gg" <gg (AT) voila (DOT) Fr> wrote in message
news:453d1abe$0$25911$ba4acef3 (AT) news (DOT) orange.fr...
Je souhaiterais savoir comment peut-on implémenter des
threads en C++ de façon assez simple, et que le tout reste
multi-plateforme ?
Dans une exemple, vous voyez SecondThreadFunc() est un thread
nous voulons le lancer dans un second thread.
|
Il a dit multi-plateforme, à ce qu'il me semble. Or, ce que tu
as écrit ne se compile même pas sur la plupart des plateformes
auxquelles j'ai accès.
En fait, au moins d'utiliser une bibliothèque tièrce qui masque
les différences, on ne peut actuellement pas faire du threading
avec du code portable. Je m'attends cependant que ça change avec
la prochaine version du C++. Et de toute probabilité (mais c'est
loin d'être sûr), la syntaxe se ressemblerait un peu à celui de
boost.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Venus²² Guest
|
Posted: Tue Nov 14, 2006 11:25 pm Post subject: Re: Threads |
|
|
"James Kanze" <james.kanze (AT) gmail (DOT) com> wrote in message
news:1163523266.859325.12080 (AT) h48g2000cwc (DOT) googlegroups.com...
Venus²² wrote:
| Quote: | "gg" <gg (AT) voila (DOT) Fr> wrote in message
news:453d1abe$0$25911$ba4acef3 (AT) news (DOT) orange.fr...
Je souhaiterais savoir comment peut-on implémenter des
threads en C++ de façon assez simple, et que le tout reste
multi-plateforme ?
Dans une exemple, vous voyez SecondThreadFunc() est un thread
nous voulons le lancer dans un second thread.
Il a dit multi-plateforme, à ce qu'il me semble. Or, ce que tu
|
Pour multi-platform, remplacez "beginthreadex()" par "Spawn()" |
|
| Back to top |
|
 |
Sylvain Guest
|
Posted: Wed Nov 15, 2006 12:08 am Post subject: Re: Threads |
|
|
Venus²² wrote on 14/11/2006 13:11:
| Quote: |
Dans une exemple, vous voyez SecondThreadFunc() est un thread nous voulons
le lancer dans un second thread.
|
par paraphraser James, pas très portable tout cela ...
| Quote: | #include <windows.h
|
ça commence mal question portabilité.
| Quote: | #include <stdio.h
#include <process.h
unsigned Counter;
|
jamais initialisé mais utilisé comme critère de sortie du 2nd thread!
| Quote: | unsigned __stdcall SecondThreadFunc( void* pArguments )
|
le propotype des fonctions passées à _beginthread (process.h) est:
void (__cdecl *start_address)(void*);
"unsigned [int]" n'est pas équivalent à "void"
| Quote: | {
printf( "In second thread...\n" );
while ( Counter < 1000000 )
Counter++;
|
ou plutôt:
counter = 0;
while (++counter < 1000000)
;
| Quote: | _endthreadex( 0 );
return 0;
|
mets simplement AX à 0, cela ne confusera pas l'appelant (heureusement)
qui n'attendait aucune valeur de retour.
| Quote: | }
void main()
{
HANDLE hThread;
|
non, _beginthread retourne un unsigned long, pas un void*
(en C++ la déclaration groupée en en-tête n'est pas obligatoire...)
| Quote: | unsigned threadID;
printf( "Creating second thread...\n" );
// Create the second thread.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0,
&threadID );
|
donc:
unsigned long thread = _beginthread(null, 0, ...);
| Quote: | // Wait until second thread has terminated. If you comment out the line
// below, Counter will not be correct because the thread has not
// terminated, and Counter most likely has not been incremented to
// 1000000 yet.
WaitForSingleObject( hThread, INFINITE );
|
vous mélangez ici 2 utilisations distinctes; un (process)thread créé par
_beginthread n'est pas un handle pouvant être attendu/signalé.
il aurait fallu ici une global "bool threadCompleted;" positionnée par
SecondThreadFunc à la sortie du while() ou encore faire une lecture
concurrentielle de Counter pour déterminer si la valeur max. est atteinte.
| Quote: | printf( "Counter should be 1000000; it is-> %d\n", Counter );
// Destroy the thread object.
CloseHandle( hThread );
|
re-non, le thread n'est pas un handle, vous confondez avec
CreateThread() (également MS spécific) qui lui retourne un HANDLE
pouvant être utilisé pour tuer le process d'autorité (TerminateThread())
et le surveiller/signaler (WaitForSingleObject() et CloseHandle()).
Sylvain. |
|
| Back to top |
|
 |
Alain Gaillard Guest
|
Posted: Wed Nov 15, 2006 12:32 am Post subject: Re: Threads |
|
|
Venus²² a écrit :
| Quote: | Pour multi-platform, remplacez "beginthreadex()" par "Spawn()"
|
et WaitForSingleObject, on le remplace par quoi ?
--
Alain |
|
| Back to top |
|
 |
Venus²² Guest
|
Posted: Wed Nov 15, 2006 12:39 am Post subject: Re: Threads |
|
|
"Sylvain" <noSpam (AT) mail (DOT) net> wrote in message
news:455a061b$0$27407$ba4acef3 (AT) news (DOT) orange.fr...
| Quote: | Venus²² wrote on 14/11/2006 13:11:
Dans une exemple, vous voyez SecondThreadFunc() est un thread nous
voulons le lancer dans un second thread.
par paraphraser James, pas très portable tout cela ...
#include <windows.h
ça commence mal question portabilité.
#include <stdio.h
#include <process.h
unsigned Counter;
jamais initialisé mais utilisé comme critère de sortie du 2nd thread!
unsigned __stdcall SecondThreadFunc( void* pArguments )
le propotype des fonctions passées à _beginthread (process.h) est:
void (__cdecl *start_address)(void*);
"unsigned [int]" n'est pas équivalent à "void"
{
printf( "In second thread...\n" );
while ( Counter < 1000000 )
Counter++;
ou plutôt:
counter = 0;
while (++counter < 1000000)
;
_endthreadex( 0 );
return 0;
mets simplement AX à 0, cela ne confusera pas l'appelant (heureusement)
qui n'attendait aucune valeur de retour.
}
void main()
{
HANDLE hThread;
non, _beginthread retourne un unsigned long, pas un void*
(en C++ la déclaration groupée en en-tête n'est pas obligatoire...)
unsigned threadID;
printf( "Creating second thread...\n" );
// Create the second thread.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL,
0,
&threadID );
donc:
unsigned long thread = _beginthread(null, 0, ...);
// Wait until second thread has terminated. If you comment out the
line
// below, Counter will not be correct because the thread has not
// terminated, and Counter most likely has not been incremented to
// 1000000 yet.
WaitForSingleObject( hThread, INFINITE );
vous mélangez ici 2 utilisations distinctes; un (process)thread créé par
_beginthread n'est pas un handle pouvant être attendu/signalé.
il aurait fallu ici une global "bool threadCompleted;" positionnée par
SecondThreadFunc à la sortie du while() ou encore faire une lecture
concurrentielle de Counter pour déterminer si la valeur max. est atteinte.
printf( "Counter should be 1000000; it is-> %d\n", Counter );
// Destroy the thread object.
CloseHandle( hThread );
re-non, le thread n'est pas un handle, vous confondez avec CreateThread()
(également MS spécific) qui lui retourne un HANDLE pouvant être utilisé
pour tuer le process d'autorité (TerminateThread()) et le
surveiller/signaler (WaitForSingleObject() et CloseHandle()).
Sylvain.
|
Sylvain,
Comme j'ai dit, Spawn() est utilisé sous Windows et sous Linux, les rest
n'est pas important, c'est pour lui montrer quelques choses de
multi-platform. Windows est une part de multiplatform ailleurs. Il y a
aussi Windows.h sous Linux, avez-vous donc les meilleurs exemples pour lui?
Venus²²
/*
windows.h
Include this file if you wish to use the Windows32 API Library
Copyright (C) 1996 Free Software Foundation
Author: Scott Christley <scottc@net-community.com>
Date: 1996
This file is part of the Windows32 API Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
If you are interested in a warranty or support for this source code,
contact Scott Christley <scottc@net-community.com> for more information.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ |
|
| Back to top |
|
 |
Sylvain Guest
|
Posted: Wed Nov 15, 2006 12:53 am Post subject: Re: Threads |
|
|
Venus²² wrote on 14/11/2006 19:39:
merci de quoter correctement (inutile d'inclure ce qui est inutile).
| Quote: | Comme j'ai dit, Spawn() est utilisé sous Windows et sous Linux, les rest
n'est pas important, c'est pour lui montrer quelques choses de
multi-platform.
|
je n'ai pas commenté "Spawn" (votre 2nd post) mais bien le 1ier où à peu
près tout était, dirons-nous, approximatif; quitte à vouloir montrer,
autant le faire avec du code valide et non des erreurs sur les APIs
utilisées.
| Quote: | Windows est une part de multiplatform ailleurs.
|
je ne comprends pas cette ""phrase"".
Windows est une des plate-formes existantes, soit, écrire du code que
pour windows est une possibilité, re-soit; si la question est quelles
APIs garantissent la portabilité des threads, la seule réponse est aucune.
| Quote: | Il y a aussi Windows.h sous Linux
|
?!? pour définir tous les (ignobles) define de MS ? et alors, les
librairies que vous avez utilisé ne sont pas dispo. (windows.h ne
définit en soi aucune fonction).
Sylvain. |
|
| Back to top |
|
 |
Serge Paccalin Guest
|
Posted: Wed Nov 15, 2006 2:08 am Post subject: Re: Threads |
|
|
Le mardi 14 novembre 2006 à 19:08:34, Sylvain a écrit dans
fr.comp.lang.c++ :
| Quote: | _endthreadex( 0 );
return 0;
mets simplement AX à 0, cela ne confusera pas l'appelant (heureusement)
qui n'attendait aucune valeur de retour.
|
Oui. Ne pas appeler endthread ou endthreadex() en C++ ; cela provoque
une sortie immédiate de la fonction, donc court-circuite les appels aux
destructeurs des objets locaux...
Personne ne dit rien, là, dans un groupe consacré au C++ ?
--
___________
_/ _ \_`_`_`_) Serge PACCALIN -- sp ad mailclub.net
\ \_L_) Pour bien répondre avec Google, ne pas cliquer
-'(__) « Répondre », mais « Afficher les options »,
_/___(_) puis cliquer « Répondre » (parmi les options). |
|
| Back to top |
|
 |
Sylvain Guest
|
Posted: Wed Nov 15, 2006 8:51 am Post subject: Re: Threads |
|
|
Serge Paccalin wrote on 14/11/2006 21:08:
| Quote: |
Oui. Ne pas appeler endthread ou endthreadex() en C++ ; cela provoque
une sortie immédiate de la fonction, donc court-circuite les appels aux
destructeurs des objets locaux...
|
certes, mais ne pas l'appeler est également non encouragé par MS,
endthread forçant le ménage coté gestionnaire de process.
un meilleur conseil est n'appeler pas endthread n'importe où mais juste
à l'unique sortie propre du thread.
ie:
void threadEntryPoint(void* refCon){
// recover context, param, ..., from refCon
...
// start actual thread job
doIt(...);
//or
myBuiltOrRecoverdInstance->doIt(...);
// system clean-up
endthread();
}
Sylvain. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Nov 15, 2006 10:12 am Post subject: Re: Threads |
|
|
Venus²² wrote:
| Quote: | "Sylvain" <noSpam (AT) mail (DOT) net> wrote in message
news:455a061b$0$27407$ba4acef3 (AT) news (DOT) orange.fr...
Venus²² wrote on 14/11/2006 13:11:
Dans une exemple, vous voyez SecondThreadFunc() est un thread nous voulons
le lancer dans un second thread.
par paraphraser James, pas très portable tout cela ...
|
Je sens, en effet, que j'ai trouvé encore un meilleur victime
que toi:-).
| Quote: | #include <windows.h
ça commence mal question portabilité.
|
[...]
Note que ceci provoque une erreur aussi avec g++ (au moins avec
les options que j'utilise). Chose que la spécification du
langage exige.
Pour la reste, je te fais confiance sur les commentaires
concernantes les fonctions Windows ; je ne les connais pas du
tout, vue que je travaille surtout sous Solaris.
| Quote: | Comme j'ai dit, Spawn() est utilisé sous Windows et sous Linux,
|
Je n'ai jamais vu Spawn sous Linux. Mais c'est vrai que tant
qu'à faire, si on sait ne pas cibler Windows, on se sert
allegrément de l'interface Posix. (En fait, on vient de me dire
que les threads Posix marche même sous Windows. Mais j'attends
voir pour y croire.)
Si on doit cibler aussi Windows (cas quand même assez fréquent),
ou même sinon, je conseille fortement l'utilisation de
boost::threads. Ce n'est pas parfait (mais c'est toujours mieux
que ACE, qui était la bibliothèque de préférence avant), mais
c'est déjà pas mal -- les faiblesses principales, ce sont la
difficulté de propager une exception à travers le join, et la
risque de se rétrouver accidentalement avec des threads
detachés, quand on ne le voulait pas.
| Quote: | les rest n'est pas important,
|
Ça, c'est toi. Moi, je travaille encore à 90% sous Solaris.
| Quote: | c'est pour lui montrer quelques choses de
multi-platform.
|
Sauf que ce que tu as montré est strictement Windows, et ne
marche nulle part ailleurs.
| Quote: | Windows est une part de multiplatform ailleurs.
|
Certes. Et Boost::threads marche sous Windows aussi.
| Quote: | Il y a aussi Windows.h sous Linux,
|
Et quoi encore ? Il y a peut-être un package qu'on pourrait
installer pour simuler un environement Windows sous Linux, mais
ce n'est pas installé sur les Linux que je connais.
| Quote: | avez-vous donc les meilleurs exemples pour lui?
|
J'en ai posté un.
Tu réponds avec 20 jours de rétard, et avec une réponse
complétement à côté des pompes. Et tu sembles étonné qu'on
critique ta réponse.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Nov 15, 2006 10:12 am Post subject: Re: Threads |
|
|
Venus²² wrote:
| Quote: | "James Kanze" <james.kanze (AT) gmail (DOT) com> wrote in message
news:1163523266.859325.12080 (AT) h48g2000cwc (DOT) googlegroups.com...
Venus²² wrote:
"gg" <gg (AT) voila (DOT) Fr> wrote in message
news:453d1abe$0$25911$ba4acef3 (AT) news (DOT) orange.fr...
Je souhaiterais savoir comment peut-on implémenter des
threads en C++ de façon assez simple, et que le tout reste
multi-plateforme ?
Dans une exemple, vous voyez SecondThreadFunc() est un thread
nous voulons le lancer dans un second thread.
Il a dit multi-plateforme, à ce qu'il me semble. Or, ce que tu
Pour multi-platform, remplacez "beginthreadex()" par "Spawn()"
|
Je n'ai pas de Spawn() non plus sur les machines que j'utilise
d'habitude. Et je n'ai pas les en-têtes que tu as utilisé non
plus. La seule solution « standard » multi-plateforme que je
connais utilise « pthread_create » et « pthread_join ». Il
marche sur prèsque toutes les plateformes sauf une.
Malheureusement, la plateforme où il ne marche pas, c'est
Windows.
Sinon, il existe pas mal de bibliothèques tièrces pour résoudre
le problème, où le code qui dépend de la plateforme n'est pas
ton problème. Au moins d'implémenter soi-même une telle
bibliothèque, je dirais qu'il faudrait s'en servir. Aujourd'hui,
je dirais même qu'il faudrait préférer celle de Boost, ne
serait-ce que parce que la syntaxe qui sera adoptée dans la
prochaine version de C++ risque de lui être très proche. Donc :
#include <boost/thread.hpp>
#include <iostream>
#include <ostream>
int counter = 0 ;
void
secondThreadFunc()
{
std::cout << "In second thread..." << std::endl ;
while ( counter < 1000000 ) {
++ counter ;
}
}
int
main()
{
std::cout << "Creating second thread..." << std::endl ;
boost::thread thread2( &secondThreadFunc ) ;
thread2.join() ;
std::cout << "counter == " << counter << std::endl ;
return 0 ;
}
(Ça marche aussi bien sous Solaris que sous Linux ou sous
Windows chez moi.)
Note bien qu'on peut se servir de boost::bind comme paramètre de
construction du thread, ce qui veut dire qu'on peut lui passer à
peu près les paramètres qu'on veut -- y compris des pointeurs
ou des références, pour des paramètres out.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Laurent Pointal Guest
|
Posted: Wed Nov 15, 2006 10:12 am Post subject: Re: Threads |
|
|
| Quote: | "gg" <gg (AT) voila (DOT) Fr> wrote in message
news:453d1abe$0$25911$ba4acef3 (AT) news (DOT) orange.fr...
Bonjour,
Je souhaiterais savoir comment peut-on implémenter des threads en C++ de
façon assez simple, et que le tout reste multi-plateforme ?
merci bien,
|
Pour l'aspect multiplateforme, en attendant une normalisation de l'API
C++ pour le multithreading, vous pouvez aussi regarder du côté des
pthread (posix threads) dont il existe une implémentation pour Win32.
http://sourceware.org/pthreads-win32/
Sinon, pour de l'encapsulation C++, il y a d'autres librairies qui
existent (le gros ACE), la partie omnithread d'OmniORB.
http://www.cs.wustl.edu/~schmidt/ACE.html
http://omniorb.sourceforge.net/
A+
Laurent. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Nov 15, 2006 10:12 am Post subject: Re: Threads |
|
|
Sylvain wrote:
| Quote: | Venus²² wrote on 14/11/2006 19:39:
|
[...]
| Quote: | si la question est quelles
APIs garantissent la portabilité des threads, la seule réponse est aucune.
|
Aucune normalisée (bien que... si la porte de pthreads vers
Windows marche, Posix est aussi une norme). Ça changera sans
doute avec la prochaine version de la norme C++.
Sinon, il en existe pas mal de bibliothèques tièrces portables,
au moins entre Windows et les diverses Unix. (S'il faut
supporter aussi VMS ou d'autres, je ne sais pas.) Boost::threads
risque fort d'être à la base de ce qui sera adopté par C++, mais
c'est vrai que l'installation de Boost n'est pas ce qu'il y a de
plus facile ni de plus légère. Sinon, Dominique et Laurent en
ont cité d'autres ; avant Boost, ACE avait le vent en poupe.
Certains autres bibliothèques tièrces fournissent aussi une
gestion portable des threads : OmniORB a déjà été cité, mais je
crois que Qt (ou peut-être wxWidgets) aussi. Si tu utilises une
de ces bibliothèques, évidemment, tu as tout à fait intérêt
d'utiliser leur API de threading aussi.
| Quote: | Il y a aussi Windows.h sous Linux
?!? pour définir tous les (ignobles) define de MS ? et alors, les
librairies que vous avez utilisé ne sont pas dispo. (windows.h ne
définit en soi aucune fonction).
|
J'imagine qu'il s'agit d'un package d'émulation, pour faciliter
la porte des applications Windows. Mais je ne peux pas en dire
plus, étant donné que ce n'est pas installé sur les Linux
auxquels j'ai accès. Mais j'en serais un peu méfiant (de même
que je suis méfiant des émulations de pthreads sous Windows).
Les philosophies de base sont différentes, ce qui mène souvent à
des problèmes dans l'émulation, ou au minimum, une perte de
performances importantes.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|