2009-07-23 6 views
2

J'ai le code de Windows suivant qui génère deux threads attend alors jusqu'à ce qu'ils aient tous deux achevés:Y at-il un équivalent pthread WatiForMultipleObjects

hThreads[0] = _beginthread(&do_a, 0, p_args_a); 
hThreads[1] = _beginthread(&do_b, 0, p_args_b); 
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE); 

Je PORTAGE maintenant le même code à utiliser pthreads mais je suis pas sûr comment faire l'équivalent de WaitForMultipleObjects:

pthread_create(&hThreads[0], 0, &do_a, p_args_a); 
pthread_create(&hThreads[1], 0, &do_b, p_args_b); 
??? 

est-il un moyen équivalent, en utilisant pthreads, pour obtenir les mêmes fonctionnalités?

Répondre

4

Si vous voulez attendre tout, comme vous le faites ici, vous pouvez simplement appeler pthread_join() pour chaque thread. Cela va accomplir la même chose.

pthread_create(&hThreads[0], 0, &do_a, p_args_a); 
pthread_create(&hThreads[1], 0, &do_b, p_args_b); 

pthread_join(hThreads[0], NULL); 
pthread_join(hThreads[1], NULL); 

Vous pouvez obtenir de la fantaisie et le faire dans une boucle for si vous avez plus de quelques threads.

+0

Ai-je besoin d'appeler pthread_exit dans do_a et do_b? –

+0

Quelques lectures supplémentaires ... pthread_exit n'est vraiment nécessaire que pour renvoyer des informations à l'appel pthread_join en attente de la sortie du thread? –

+0

Désolé, je viens de voir votre commentaire. Non, vous n'avez pas besoin d'appeler 'pthread_exit' sauf si c'est plus pratique. C'est analogue à l'appel 'exit' de' main'. Vous pouvez le faire si vous le souhaitez, mais vous pouvez aussi revenir normalement, et l'effet sera comme si vous appeliez 'pthread_exit' avec la valeur de retour de la fonction thread. Je n'appelle presque jamais 'pthread_exit'. Je n'utilise presque jamais non plus la valeur de retour (d'où la raison pour laquelle je passe NULL comme deuxième argument à 'pthread_join'). –

1

J'ai toujours juste utilisé une boucle avec pthread_join

int i; 
for(i=0;i<threads;i++) 
    pthread_join(tids[i], NULL); 
Questions connexes