2010-11-03 6 views
3

Je viens de commencer la programmation sur les threads du noyau Linux. J'ai un problème que je voudrais partager avec vous les gars. Mon code est:Comment attendre qu'un thread de noyau Linux (kthread) sorte?

void do_big_things(void *data) 
{ 
    // do some really big things 
} 
struct task_struct *t1; 
struct task_struct *t2; 

void calling_fucntion() 
{ 
    for(j =0; j < 100; j++) 
    { 
     t1 = kthread_run(do_big_things, &data1, "thread1"); 
     t2 = kthread_run(do_big_things, &data2, "thread2"); 
    } 
} 

Maintenant, pour autant que je conclus à ce problème (je peux me tromper) est que les fils t1 et t2 sont créées et exécutées par le noyau et le programme retourne à la début de la boucle pour créer et exécuter deux autres threads. Comme il n'y a aucune condition à attendre pour que ces threads se terminent, le noyau crée autant de threads provoquant ainsi un débordement de pile. Tout ce que je veux, c'est savoir comment faire en sorte que le programme attende que ces deux threads se terminent, puis recommence la boucle en commençant deux autres threads.

Toute aide serait appréciée.

Répondre

3
/* Wait for kthread_stop */ 
set_current_state(TASK_INTERRUPTIBLE); 
while (!kthread_should_stop()) { 
    schedule(); 
    set_current_state(TASK_INTERRUPTIBLE); 
} 

Vérifiez cet article pour plus d'informations: "Sleeping in the Kernel".

1

En savoir plus sur les files d'attentes. Ceci est un good place à regarder. Essentiellement, vous devez suivre le nombre de threads en cours d'exécution (compteur protégé par verrous) et placer le thread de création sur une file d'attente, jusqu'à ce que tous les threads soient terminés. Le dernier thread qui termine son travail peut réveiller le thread sur la file d'attente, afin qu'il puisse répéter le processus avec une autre paire de threads.

+0

Mon processus de création de thread est un module noyau. Dois-je mettre ce module dans une file d'attente? –

+1

Non, vous mettez des threads dans la file d'attente. Je vous disais simplement le mécanisme général pour gérer ce genre de problème. Vous devez savoir dans quel contexte fonctionne la fonction appelante et trouver une solution en conséquence. – Sudhanshu

1

Cela dépend de ce que vous faites, mais vous ne voulez peut-être même pas démarrer vos propres threads du noyau.

Vous pouvez soumettre un travail à exécuter sur la file d'attente globale du noyau en utilisant schedule_work().

Si vous utilisez votre propre thread, vous l'écrivez généralement en boucle autour de kthread_should_stop(). Ensuite, le code qui veut que le thread se termine appelle kthread_stop(), ce qui indique au thread de s'arrêter puis attend qu'il s'arrête.

+0

Je suis intéressé par your'schedule_work() 'pouvez-vous écrire un exemple de code sur comment l'utiliser et l'attendre pour terminer s'il vous plaît? – user2284570