OVH Cloud OVH Cloud

[HS] Threads

10 réponses
Avatar
François Boisson
Je n'avais pas eu l'occasion d'utiliser les threads jusqu'à présent, et
la nécessité de ne rater aucun paquet UDP arrivant à été une bonne
occasion (cf message pour les joueurs de CS). Une question cependant, je
crée un seul filament ce qui avait le filament maitre fait deux
filaments donc 2 processus. Or ps -x montre trois processus:

21544 pts/8 S+ 0:00 logrecept -y
21546 pts/8 S+ 0:00 logrecept -y
21547 pts/8 S+ 0:01 logrecept -y


Est ce que la création d'un filament engendre systématiquement un
processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
comprendre ce processus «en trop»...


François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

10 réponses

Avatar
David Dumortier
'Soir,
François Boisson wrote:

Je n'avais pas eu l'occasion d'utiliser les threads jusqu'à présent, et
la nécessité de ne rater aucun paquet UDP arrivant à été une bonne
occasion (cf message pour les joueurs de CS). Une question cependant, je
crée un seul filament ce qui avait le filament maitre fait deux
filaments donc 2 processus. Or ps -x montre trois processus:

21544 pts/8 S+ 0:00 logrecept -y
21546 pts/8 S+ 0:00 logrecept -y
21547 pts/8 S+ 0:01 logrecept -y




Que dit `ps fax` ?

Est ce que la création d'un filament engendre systématiquement un
processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
comprendre ce processus «en trop»...




Idem pour moi, sauf que je n'ai pas testé en "réel".
Je suis perplexe.

François Boisson




David Dumortier.


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
JusTiCe8
Bonsoir,

François Boisson a écrit :

[...]

Est ce que la création d'un filament engendre systématiquement un
processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
comprendre ce processus «en trop»...






mmm... ce ne serait pas le père ?
D'après mes souvenirs (un peu lointains) les threads sous Linux existent
au sain d'un processus classique (au sens Unix), comme une enveloppe,
donc 1 thread = 1 processus conteneur, 2 threads = 1 conteneur, ... A
vérifier avec le code de l'ordonnanceur (je suis presque sûr qu'il y a
des différences aussi entre les 2.4 et les 2.6, quel est le noyau de la
machine sur lesquelles tu fait mumuse François ?)

François Boisson



J8.


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
François Boisson
Le Tue, 12 Apr 2005 22:40:56 +0200
David Dumortier a écrit:

'Soir,
François Boisson wrote:

>Je n'avais pas eu l'occasion d'utiliser les threads jusqu'à présent,
>et la nécessité de ne rater aucun paquet UDP arrivant à été une bonne
>occasion (cf message pour les joueurs de CS). Une question cependant,
>je crée un seul filament ce qui avait le filament maitre fait deux
>filaments donc 2 processus. Or ps -x montre trois processus:
>
>21544 pts/8 S+ 0:00 logrecept -y
>21546 pts/8 S+ 0:00 logrecept -y
>21547 pts/8 S+ 0:01 logrecept -y
>
>
Que dit `ps fax` ?



21389 pts/8 Ss 0:00 _ bash -i
21544 pts/8 S+ 0:00 _ logrecept -y
21546 pts/8 S+ 0:00 _ logrecept -y
21547 pts/8 S+ 0:02 _ logrecept-y

A priori, il est normal que le dernier soit celui qui bosse, il fabrique
les requêtes SQL et les exécute, le maître se contente (comme tous les
patrons (!)) de recevoir les paquets et de transmettre...


Bizarre...

>Est ce que la création d'un filament engendre systématiquement un
>processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
>comprendre ce processus «en trop»...
>
>
Idem pour moi, sauf que je n'ai pas testé en "réel".
Je suis perplexe.





François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
David Dumortier
Re, j'ai un peu buché ...
et désolé pour le cc mal-venu
<troll>y a pas, les trucs graphiques pour le mail c'est nul</troll>

François Boisson wrote:

Je n'avais pas eu l'occasion d'utiliser les threads jusqu'à présent, et
la nécessité de ne rater aucun paquet UDP arrivant à été une bonne
occasion (cf message pour les joueurs de CS). Une question cependant, je
crée un seul filament ce qui avait le filament maitre fait deux
filaments donc 2 processus. Or ps -x montre trois processus:




processus et thread c'est différent.
tu dois effectivement avoir un thread ou plusieurs pour un processus.
Donc ton processus "maitre" qui créé les 2 threads, le processus mutex
mais avis et un troisieme que je ne comprends pas, tu ne fork pas ?

21544 pts/8 S+ 0:00 logrecept -y
21546 pts/8 S+ 0:00 logrecept -y
21547 pts/8 S+ 0:01 logrecept -y


Est ce que la création d'un filament engendre systématiquement un
processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
comprendre ce processus «en trop»...




Je le pense :qu'un ps plus pousser serait pas mal :
ps axH
devrait te donner des indications de threads par processus

François Boisson






--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
manioul
--=-GGKgH4gkNXiYHJKdojno
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Le mardi 12 avril 2005 à 23:17 +0200, François Boisson a écrit :
[...]
> Que dit `ps fax` ?

21389 pts/8 Ss 0:00 _ bash -i
21544 pts/8 S+ 0:00 _ logrecept -y
21546 pts/8 S+ 0:00 _ logrecept -y
21547 pts/8 S+ 0:02 _ logrecept-y

A priori, il est normal que le dernier soit celui qui bosse, il fabrique
les requêtes SQL et les exécute, le maître se contente (comme tous les
patrons (!)) de recevoir les paquets et de transmettre...


Tu as bien vérifié dans ton code si tu es fils ou parent? Il semble que
tes processus fils fork...


Bizarre...
>
> >Est ce que la création d'un filament engendre systématiquement un
> >processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
> >comprendre ce processus «en trop»...


Par filament, tu entends bien créer un fils (fork)?
> >
> >
> Idem pour moi, sauf que je n'ai pas testé en "réel".
> Je suis perplexe.
>


François Boisson



++ ;)

--
-----------------------------------------------------------------------
Ma clé GPG est disponible sur http://www.keyserver.net
-----------------------------------------------------------------------
_____________________________________________________
| Protégez votre vie privée: |
|||/ | - Signez/chiffrez vos messages. __|
q o - p | Respectez celle des autres: | /
__mn___^_/_nm__| - Masquez les destinataires de vos mailings |/
|__________________________________________________/


--=-GGKgH4gkNXiYHJKdojno
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)

iD8DBQBCXFWDcsdrgK9aigMRAvypAJ9k4tdtC3x6t0LH/olrULKQEWtP6ACeJsHS
w4NP/HMCc1wXoeSOjyLNV2k =Yzg2
-----END PGP SIGNATURE-----

--=-GGKgH4gkNXiYHJKdojno--


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
François Boisson
Le Wed, 13 Apr 2005 01:10:59 +0200
manioul a écrit:

Le mardi 12 avril 2005 à 23:17 +0200, François Boisson a écrit :
[...]
> > Que dit `ps fax` ?
>
> 21389 pts/8 Ss 0:00 _ bash -i
> 21544 pts/8 S+ 0:00 _ logrecept -y
> 21546 pts/8 S+ 0:00 _ logrecept -y
> 21547 pts/8 S+ 0:02 _
> logrecept-y
>
> A priori, il est normal que le dernier soit celui qui bosse, il
> fabrique les requêtes SQL et les exécute, le maître se contente
> (comme tous les patrons (!)) de recevoir les paquets et de
> transmettre...
Tu as bien vérifié dans ton code si tu es fils ou parent? Il semble
que tes processus fils fork...




Un seul thread est crée dès le début et le fils ne crée plus rien. J'ai
confirmé cela en détournant le sigint et en le faisant afficher un texte
(«Ctrl-C rencontré»). 2 textes seuls s'affichent au ^C.

Par filament, tu entends bien créer un fils (fork)?



thread (l'espace données reste le même).

François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
François Boisson
Le Wed, 13 Apr 2005 01:10:59 +0200
manioul a écrit:

Le mardi 12 avril 2005 à 23:17 +0200, François Boisson a écrit :
[...]
> > Que dit `ps fax` ?
>
> 21389 pts/8 Ss 0:00 _ bash -i
> 21544 pts/8 S+ 0:00 _ logrecept -y
> 21546 pts/8 S+ 0:00 _ logrecept -y
> 21547 pts/8 S+ 0:02 _
> logrecept-y
>
> A priori, il est normal que le dernier soit celui qui bosse, il
> fabrique les requêtes SQL et les exécute, le maître se contente
> (comme tous les patrons (!)) de recevoir les paquets et de
> transmettre...
Tu as bien vérifié dans ton code si tu es fils ou parent? Il semble
que tes processus fils fork...




Je confirme bien, un thread crée, 3 processus fils l'un de l'autre:

Le petit fils est le thread (il disparait à la fin du thread)
Le père est le processus maitre
Le fiston semble être un processus qui gère les mutex et autres conds,
j'ai testé ça avec le programme suivant en le modifiant pour geler ou
non l'arrêt.

François Boisson

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#include <malloc.h>
pthread_mutex_t mutex_file = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_boulot = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_boulot = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex_fini = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_fini = PTHREAD_COND_INITIALIZER;
pthread_t tache;

int STOP=0;


void rajoute()
{
printf("Hop un coup de tachen");
pthread_mutex_lock(& mutex_boulot);
pthread_cond_signal(& cond_boulot);
pthread_mutex_unlock(& mutex_boulot);
}

void * tache_de_fond(queud)
void *queud;
{
while(STOP==0)
{
printf("Salut c'est le threadn");
pthread_mutex_lock(& mutex_boulot);
pthread_cond_wait(& cond_boulot,& mutex_boulot);
pthread_mutex_unlock(& mutex_boulot);
}
printf("Stop Threadn");
pthread_mutex_lock(& mutex_fini);
pthread_cond_signal(& cond_fini);
pthread_mutex_unlock(& mutex_fini);
printf("Retour Threadn");
pthread_exit(NULL);
}


void arret(inutile)
int inutile;
{
int i,j,k,l;
printf("STOP: ^C arrivén");
pthread_mutex_lock(& mutex_boulot);
pthread_cond_signal(& cond_boulot);
pthread_mutex_unlock(& mutex_boulot);
if (pthread_equal(tache,pthread_self()))
{
printf("Hmm, CtrlC sur le Threadn");
}
else
{
printf("On arrete le thread!n");
pthread_mutex_lock(& mutex_fini);
printf("Attente du threadn");
STOP=1;
/* attente de la fin du thread */
pthread_mutex_lock(& mutex_boulot);
pthread_cond_signal(& cond_boulot);
pthread_mutex_unlock(& mutex_boulot);
pthread_cond_wait(& cond_fini,& mutex_fini);
pthread_mutex_unlock(& mutex_fini);
printf("Ahah thread fini?n");
pthread_join(tache,NULL);
/* on arrete l'envoi des logs */
printf("Thread fini!n");
exit(0);
}
}

main(argc,argv)
int argc;
char **argv;
{
/* programmation dégueulasse, ramassis de variables, tant pis */

signal(SIGINT,arret);
/* lancement du thread */
pthread_create(&tache,NULL,tache_de_fond,NULL);
while (1==1)
{
pthread_mutex_lock(& mutex_boulot);
pthread_cond_signal(& cond_boulot);
pthread_mutex_unlock(& mutex_boulot);
}

exit(0);
}


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Fabien R
On Tuesday 12 April 2005 23:06, JusTiCe8 wrote:
Bonsoir,

François Boisson a écrit :
>[...]
>
>Est ce que la création d'un filament engendre systématiquement un
>processus qui chapeaute le tout (signal, mutex, etc)? J'ai du mal à
>comprendre ce processus «en trop»...

mmm... ce ne serait pas le père ?
D'après mes souvenirs (un peu lointains) les threads sous Linux existent
au sain d'un processus classique (au sens Unix), comme une enveloppe,
donc 1 thread = 1 processus conteneur, 2 threads = 1 conteneur, ... A
vérifier avec le code de l'ordonnanceur (je suis presque sûr qu'il y a
des différences aussi entre les 2.4 et les 2.6, quel est le noyau de la
machine sur lesquelles tu fait mumuse François ?)


Exact, en 2.4, ps affiche tous les threads et en 2.6, on ne voit que le
conteneur.


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
François Boisson
Le Tue, 12 Apr 2005 23:06:30 +0200
JusTiCe8 a écrit:


D'après mes souvenirs (un peu lointains) les threads sous Linux
existent au sain d'un processus classique (au sens Unix), comme une
enveloppe, donc 1 thread = 1 processus conteneur, 2 threads = 1
conteneur, ... A vérifier avec le code de l'ordonnanceur (je suis
presque sûr qu'il y a des différences aussi entre les 2.4 et les 2.6,
quel est le noyau de la machine sur lesquelles tu fait mumuse François
?)





Toutes des 2.4, j'aime la stabilité. D'après mes tests donc, le
lancement d'un filament (=thread, traduction correcte?) se ferait comme
suit:
A crée B qui supervise tous les filaments crées. Donc 1 filament montre

A (processus d'origine) père de B (le conteneur donc dans ce que tu dis)
père de C (le filament proprement dit).

Tout cela est cohérent... et assez efficace en pratique, par contre il y
a des pièges dans la programmation et ce qui parait de prime abord une
usine à gaz se révèle assez simple et assez logique.


François Boisson


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Sylvain Sauvage
Comput unicum 1113414368 (Wed, 13 Apr 2005 19:46:08 +0200),
Fabien R a écrit :

Exact, en 2.4, ps affiche tous les threads et en 2.6, on ne voit que le
conteneur.



En 2.6, on peut les voir dans /proc/<pid>/task (le répertoire <pid> père
et les répertoire <pid> des fils (= fil au pluriel, pas « enfant ») ).

--
Sylvain Sauvage