Je construis un planificateur de threads d'espace utilisateur préemptif qui utilise un temporisateur pour interrompre les threads et basculer entre eux en fonction de la priorité. Cependant, une fois qu'un thread est interrompu, je n'arrive pas à le laisser finir; recommencez le. Est ce que je demande même possible en utilisant swapcontext? Le résultat de ce code, qui devrait permettre à itake5seconds() de se terminer, ne fait que répéter le message "Hello" encore et encore.Comment puis-je reprendre l'exécution d'une fonction (ne pas la redémarrer) en utilisant swapcontext()?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <ucontext.h>
static ucontext_t mainc, newthread;
void itake5seconds()
{
puts("Hello. I take 5 seconds to run.");
sleep(5);
puts("And I'm done! Wasn't that nice?");
}
void timer_handler(int signum)
{
puts("Doing some scheduler stuff.");
swapcontext(&mainc, &newthread);
}
int main(int argc, char* argv[])
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = &timer_handler;
sigaction(SIGALRM, &sa, NULL);
getcontext(&newthread);
newthread.uc_stack.ss_sp = malloc(5000);
newthread.uc_stack.ss_size = 5000;
newthread.uc_link = &mainc;
makecontext(&newthread, &itake5seconds, 0);
struct itimerval timer;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 500000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 500000;
setitimer(ITIMER_REAL, &timer, NULL);
while(1);
return 0;
}
Pouvez-vous fournir le code mis à jour pour que tout le monde puisse le voir? – Mike