OVH Cloud OVH Cloud

Threads

30 réponses
Avatar
gg
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

10 réponses

1 2 3
Avatar
loufoque

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

Avatar
Dominique Vaufreydaz
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 ?


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.

Avatar
Venus²²
"gg" wrote in message
news:453d1abe$0$25911$
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


Dans une exemple, vous voyez SecondThreadFunc() est un thread nous voulons
le lancer dans un second thread.


Sample Code

/* Compile options needed: Default options for a multithreaded console
application. You need to compile the code as a .CPP file.
*/

#include <windows.h>
#include <stdio.h>
#include <process.h>

unsigned Counter;

unsigned __stdcall SecondThreadFunc( void* pArguments )
{
printf( "In second thread...n" );

while ( Counter < 1000000 )
Counter++;

_endthreadex( 0 );
return 0;
}

void main()
{
HANDLE hThread;
unsigned threadID;

printf( "Creating second thread...n" );

// Create the second thread.

hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0,
&threadID );

// 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 );

printf( "Counter should be 1000000; it is-> %dn", Counter );

// Destroy the thread object.

CloseHandle( hThread );
}

Avatar
James Kanze
Venus²² wrote:
"gg" wrote in message
news:453d1abe$0$25911$

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


Avatar
Venus²²
"James Kanze" wrote in message
news:
Venus²² wrote:
"gg" wrote in message
news:453d1abe$0$25911$

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()"


Avatar
Sylvain
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-> %dn", 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.

Avatar
Alain Gaillard


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


et WaitForSingleObject, on le remplace par quoi ?

--
Alain

Avatar
Venus²²
"Sylvain" wrote in message
news:455a061b$0$27407$
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-> %dn", 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

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

*/


Avatar
Sylvain
Venus²² wrote on 14/11/2006 19:39:



merci de quoter correctement (inutile d'inclure ce qui est inutile).

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.

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.

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.

Avatar
Serge Paccalin
Le mardi 14 novembre 2006 à 19:08:34, Sylvain a écrit dans
fr.comp.lang.c++ :

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

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


1 2 3