1

salut j'ai pas vu ça sur la première page, je poste.

voila je veux faire un truc multithread sous linux en utilisant libpthread, j'ai fait le code suivant:
//fichier de test pour voir comment marchent des threads

#include <stdio.h>
#include <pthread.h>

void *thread1(void* arg) {
int i;
printf("Le thread 1 demarre\n");
for(i=1;i<10;i++) printf("a= %d\n",i);
printf("Le thread 1 s'arrete\n");
}

void *thread2(void* arg) {
int i;
printf("Le thread 2 demarre\n");
for(i=1;i<10;i++) printf("b= %d\n",i);
printf("Le thread 2 s'arrete\n");
}

int main(void) {
pthread_t t1;
pthread_t t2;
int res;

printf("debut de la creation du premier pthread...\n");
res = pthread_create( &t1, NULL, &thread1, NULL);
printf("res=%d\tthreadID=0x%p\n",res,t1);

printf("debut de la creation du deuxieme pthread...\n");
res = pthread_create( &t2, NULL, &thread2, NULL);
printf("res=%d\tthreadID=0x%p\n",res,t2);

return 0;
}


je compile avec (gcc 3.4 et libpthread.so.0)
gcc threads.c -lpthread -o threads


ben ça me fait:
[squalyl@portable threads]$ ./threads
debut de la creation du premier pthread...
res=0   threadID=0x0xb7fe8bb0
debut de la creation du deuxieme pthread...
res=0   threadID=0x0xb75e7bb0
[squalyl@portable threads]$


pour info ça fait pareil sous win32 avec libpthread-win32 et devcpp
le retour de pthread_create vaut 0 donc y'a pas eu d'erreur par contre le thread démarre pas.
le prototype concerné est:
extern int pthread_create (pthread_t *__restrict __threadp,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *), void *__restrict __arg) __THROW

(variable d'identification, attributs, routine, arg)

le proto de routine est bien void *func(void*)
le man dit que les attributs peuvent être NULL (thread joignable), j'arrive pas à passer autre chose de toute

help! j'ai faux, mais à quel moment?

merci!

2

j'ai pas trop eu le temps de regarder, mais essaye de mettre un pthread_join(..).

Attention sous win la lib n'est pas posix (comme d'hab..)

3

pkoi ne pas utilisé une lib incluse dans boost qui gere ca ?
ca permet de ne pas te faire chier avec le système...

4

kess tu parles de boost? je connais pas et je m'en fiche.

sous nux y'a une lib posix qui gère des threads je veux m'en servir sans complications

et sous win j'ai testé juste pour le fun. l'appli est sous nux.

depuis man pthread_join(3):
int pthread_join(pthread_t th, void **thread_return); pthread_join suspends the execution of the calling thread until the thread identified by th terminates, either by calling pthread_exit(3) or by being cancelled.

ça vient faire quoi ici?

ok j'attendrai la réponse de qqn qui connait.

5

Ton programme, après avoir crée les 2 threads, quitte la fonction main,
puis a la toute fin, la premiere des fonctions qui ait appele une autre appele le syscall exit.
Tes threads n'ont meme pas eu la chance de s'executer tongue

Comme dit JackosKing, un pthread_join() avant le retour; permet d'attendre la fin de tes 2 threads.

Mais apparament ca dépend de l'implementation des threads sur le systeme,
sous OpenBSD le thread1 s'est execute pour moi mais pas le 2eme (sauf avec la modif).

Faut aussi prendre en compte que sous open les pth ne sont pas natifs
Sous linux il me semble qu'il le sont

% cat t.c
//fichier de test pour voir comment marchent des threads

#include <stdio.h>
#include <pthread.h>

void *thread1(void* arg) {
int i;
printf("Le thread 1 demarre\n");
for(i=1;i<3;i++) printf("a= %d\n",i);
printf("Le thread 1 s'arrete\n");
return ((void *)0x24);
}

void *thread2(void* arg) {
int i;
printf("Le thread 2 demarre\n");
for(i=1;i<3;i++) printf("b= %d\n",i);
printf("Le thread 2 s'arrete\n");
return ((void *)0x42);
}

int main(void) {
pthread_t t1;
pthread_t t2;
int res;
void *rest;

printf("debut de la creation du premier pthread...\n");
res = pthread_create( &t1, NULL, &thread1, NULL);
printf("res=%d\tthreadID=0x%p\n",res,t1);

printf("debut de la creation du deuxieme pthread...\n");
res = pthread_create( &t2, NULL, &thread2, NULL);
printf("res=%d\tthreadID=0x%p\n",res,t2);

pthread_join(t1, &rest);
printf("retour du t1: 0x%08+lx.\n", rest);
pthread_join(t2, &rest);
printf("retour du t2: 0x%08+lx.\n", rest);
return 0;
}
% cc -o t t.c -lpthread
% ./t
debut de la creation du premier pthread...
Le thread 1 demarre
a= 1
a= 2
Le thread 1 s'arrete
res=0   threadID=0x0x3c006800
debut de la creation du deuxieme pthread...
res=0   threadID=0x0x3c03f400
retour du t1: 0x00000024.
Le thread 2 demarre
b= 1
b= 2
Le thread 2 s'arrete
retour du t2: 0x00000042.
% 

Vini, vidi, vici !

6

ok merci pour l'info.

je travaille bien sous linux

7

lol, la réponse !
si je te dis ca, y'a p-ê une raison, non ?

http://www.boost.org/doc/html/threads.html

8

Boost.Threads allows C++ programs to execute as multiple, asynchronous, independent threads-of-execution.

merci pour l'info mais je fais juste du C grin

9

En fait l'ordre de lancement depend de scheduler. Mais il est possible de modifier les prioritées... donc si tu lances plusieurs fois le programme, il a un comportement differenttongue normal mais je tenais juste a le preciser.

10

je pense surtt que les threads fils sont détruits à la création du processus qui les a créés donc ils ont pas le temps de se lancer.
Une paire de wait et hop ça va marcher, je vide mes sujets et je boote nux hehe

11

pthreadjoin est la pour ca.. en plus il te permet de recuperer la donnee de retour...
Et il suffit que tu sois sous un noyau un peu different avec des priorites de l'ordonnaceur differentes et il risque de ne pas marcher!
cette fonction doit imperativement etre utilisée.

12

13

En effet ça marche quand je fais:

	printf("debut de la creation du premier pthread...\n");
	res = pthread_create( &t1, NULL, &thread1, NULL);
	printf("res=%d\tthreadID=0x%p\n",res,t1);
	pthread_join(t1, NULL);


merci smile

14

Nan c'est pas ici que tu veux le mettre sinon tu fais pas ce que tu veux, et en plus tu ne résouds pas la race condition (le second thread peut ne pas avoir le temps de s'exécuter).
Comme l'a indiqué Folays, tu fais tes pthread_join à la fin de ton main(), et il faut que tu pthread_join()es les deux threads, sinon y'a toujours la possibilité que celui que tu ne pthread_join()es pas n'ait pas le temps de s'exécuter.

Folays> les threads ne sont pas natifs sous linux (en tous cas ils l'étaient pas dans les noyaux 2.4, je sais pas si 2.6 les a ajoutés ou non). Sous les 2.4 en tous cas, les threads sont implémentés en userspace.

15

voui ct juste un exemple , je l'ai compris tout seul.

le final ça donne:
int main(void) {
	pthread_t t1;
	pthread_t t2;
	int res;
	
	printf("debut de la creation du premier pthread...\n");
	res = pthread_create( &t1, NULL, &thread1, NULL);
	printf("res=%d\tthreadID=0x%p\n",res,t1);

	printf("debut de la creation du deuxieme pthread...\n");
	res = pthread_create( &t2, NULL, &thread2, NULL);	
	printf("res=%d\tthreadID=0x%p\n",res,t2);

	pthread_join(t1, NULL); //attendre la fin des thread pour quitter
	pthread_join(t2, NULL);
    return 0;
}


et stdout montre bien que les exécutions sont simultanées.

Du coup ça compile aussi sous zin avec libpthread-win32