【发布时间】:2019-05-26 07:19:00
【问题描述】:
我正在构建一个简单的任务切换器,它在循环中运行两个函数。这个想法是它运行 f1 一段时间,然后将控制权交给 f2 相同的数量,然后是 f1,f2,在一个无限循环中。
问题是,每当我运行程序时,第一个开关运行良好,但随后的开关从未发生。卡在f2。
我尝试过其他实现最多归档 3 个开关(之后程序会冻结)。
这是我当前的实现:
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <unistd.h>
int count = 0;
int flag = 0;
void f1() {
for (;;) printf("A");
}
void f2() {
for (;;) printf("B");
}
void sched() {
flag = !flag;
if (flag)
f1();
else
f2();
}
void sighandler(int signo)
{
printf("signal %d occurred %d times\n",signo, ++count);
sched();
}
int main(void)
{
struct itimerval it;
struct sigaction act, oact;
act.sa_handler = sighandler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGPROF, &act, &oact);
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 10000;
it.it_value.tv_sec = 0;
it.it_value.tv_usec = 10000;
setitimer(ITIMER_PROF, &it, NULL);
sched();
}
任何建议将不胜感激。
【问题讨论】:
-
您正在从信号处理程序中调用代码并且永远不会从处理程序返回。并允许它(递归)再次被中断。此外,您不应在信号处理程序中调用 printf()。
-
您可以通过在
sigaction()中设置SA_NODEFER来使其工作(简单地说,未定义的行为丰富)。 -
我会采取另一条路线来解决这个问题:当使用
SA_SIGINFO提供带有刚刚中断的上下文的ucontext_t结构时,您的信号处理程序会获得第三个参数。您可以使用setcontext在两个(或更多)保存的上下文之间切换,以使结果更接近真正的抢占式调度。
标签: c multithreading timer signals