我想编写一个代码,每 10 微秒在线程之间切换一次。但问题在于产量函数。运行计时器处理程序时出现中断。所以它没有正确完成。这是我用于初始化计时器的代码:
signal(SIGALRM, &time_handler);
struct itimerval t1;
t1.it_interval.tv_sec = INTERVAL_SEC;
t1.it_interval.tv_usec = INTERVAL_USEC;
t1.it_value.tv_sec = INTERVAL_SEC;
t1.it_value.tv_usec = INTERVAL_USEC;
setitimer(ITIMER_REAL, &t1, NULL);
这是处理函数的代码:
void time_handler(int signo)
{
write(STDOUT_FILENO, "interrupt\n", sizeof("interrupt\n"));
green_yield();
}
这就是我在 yield 函数中所做的:一个队列,我们从中获取线程接下来运行。问题是在我在线程之间交换上下文之前的任何时刻,我都可以获得中断。特别是因为我在这个函数结束时交换了上下文。
int green_yield(){
green_t *susp = running ;
// add susp to ready queue
// ===========================
enQueue(ready_queue, susp);
// ===========================
// select the next thread for execution
// ===========================
green_t * next = deQueue(ready_queue);
running = next;
// ===========================
// save current state into susp->context and switch to next->context
// ===========================
swapcontext(susp->context, next->context);
return 0;}
我可以做些什么来确保我首先完成了 yield 函数然后得到了中断?