Je suis censé implémenter une bibliothèque de threads userlevel en C. Pour ce faire, j'ai besoin de mettre en œuvre les fonctions yield()
, createThread()
et destroyThread()
. Je crois que j'ai les bonnes bases:Threads dans l'espace utilisateur et le rendement
Pour garder une trace de fils, je vais utiliser une file d'attente d'ThreadControlBlock
éléments (qui ressemblent à PCBs dans un OS) qui ressemblent à ceci:
struct ThreadControlBlock {
int ThreadId,
u_context *context };
Nous peut utiliser la famille de fonctions setcontext()
pour "sauvegarder" et "charger" le contexte. Lors de l'initialisation du programme, initialisez ThreadQueue sans éléments.
Maintenant, la partie que je ne reçois pas: quand un thread appelle yield()
, j'obtiens le contexte actuel et l'enregistre dans un ThreadControlBlock
et mettre dans la file d'attente. Ensuite, récupérez le premier élément dans la file d'attente et chargez le contexte, puis l'exécution se poursuit.
La question est, si je fais cela, dites que je suis un fil appelant yield()
et le prochain fil est moi-même. Si je sauve le contexte et que je le charge à nouveau, je ne serais pas au même endroit où je me trouvais (avant d'appeler le yield()
?) Et cela continuerait toujours?
+1 pour une question connexe exemplaire à un devoir qui n'est pas seulement "s'il vous plaît faire mes devoirs pour moi". C'est une question intéressante en elle-même, une question qui touche au cœur du fonctionnement de la commutation de contexte de tâche. – RBerteig