我正在尝试实现用户级线程库,并且需要以循环方式调度线程。我目前正在尝试为我使用 makecontext、getcontext 和 swapcontext 创建的 2 个线程进行切换工作。使用具有 ITIMER_PROF 值的 setitimer,并为 sigaction 分配一个处理程序,以便在生成 SIGPROF 信号时调度一个新线程。但是,不会调用信号处理程序,因此线程永远不会被调度。可能是什么原因?以下是一些代码片段:
void userthread_init(long period){
/*long time_period = period;
//Includes all the code like initializing the timer and attaching the signal
// handler function "schedule()" to the signal SIGPROF.
// create a linked list of threads - each thread's context gets added to the list/updated in the list
// in userthread_create*/
struct itimerval it;
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = &schedule;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL);
time_period = period;
it.it_interval.tv_sec = 4;
it.it_interval.tv_usec = period;
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 100000;
setitimer(ITIMER_PROF, &it,NULL);
//for(;;);
}
上面的代码是初始化一个定时器并将一个处理程序调度附加到信号处理程序。我假设信号 SIGPROF 将被提供给将调用 scheduler() 函数的上述函数。调度器函数如下:
void schedule(int sig, siginfo_t *siginf, ucontext_t* context1){
printf("\nIn schedule");
ucontext_t *ucp = NULL;
ucp = malloc(sizeof(ucontext_t));
getcontext(ucp);
//ucp = &sched->context;
sched->context = *context1;
if(sched->next != NULL){
sched = sched->next;
}
else{
sched = first;
}
setcontext(&sched->context);
}
我有一个就绪线程队列,其中存储了它们各自的上下文。每当执行 setcontext 指令时,每个线程都应该被调度。但是,scheduler() 没有被调用!谁能指出我的错误??