C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Threads
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
gg
Guest





PostPosted: Tue Oct 24, 2006 12:40 am    Post subject: Threads Reply with quote



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





PostPosted: Tue Oct 24, 2006 2:54 am    Post subject: Re: Threads Reply with quote



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





PostPosted: Tue Oct 24, 2006 9:12 am    Post subject: Re: Threads Reply with quote



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





PostPosted: Tue Nov 14, 2006 10:54 pm    Post subject: Re: Threads Reply with quote

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





PostPosted: Tue Nov 14, 2006 11:25 pm    Post subject: Re: Threads Reply with quote

"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





PostPosted: Wed Nov 15, 2006 12:08 am    Post subject: Re: Threads Reply with quote

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





PostPosted: Wed Nov 15, 2006 12:32 am    Post subject: Re: Threads Reply with quote

Venus²² a écrit :


Quote:
Pour multi-platform, remplacez "beginthreadex()" par "Spawn()"

et WaitForSingleObject, on le remplace par quoi ?

--
Alain
Back to top
Venus²²
Guest





PostPosted: Wed Nov 15, 2006 12:39 am    Post subject: Re: Threads Reply with quote

"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





PostPosted: Wed Nov 15, 2006 12:53 am    Post subject: Re: Threads Reply with quote

Venus²² wrote on 14/11/2006 19:39:
Quote:


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





PostPosted: Wed Nov 15, 2006 2:08 am    Post subject: Re: Threads Reply with quote

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

Quote:
void main()

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





PostPosted: Wed Nov 15, 2006 8:51 am    Post subject: Re: Threads Reply with quote

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





PostPosted: Wed Nov 15, 2006 10:12 am    Post subject: Re: Threads Reply with quote

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é.

[...]
Quote:
void main()

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





PostPosted: Wed Nov 15, 2006 10:12 am    Post subject: Re: Threads Reply with quote

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





PostPosted: Wed Nov 15, 2006 10:12 am    Post subject: Re: Threads Reply with quote

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





PostPosted: Wed Nov 15, 2006 10:12 am    Post subject: Re: Threads Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.