C语言 我的线程在上下文切换后永远不会完成



所以我正在努力进行上下文切换以创建自己的线程库。不过我遇到了很多困难。我创建了一个队列,我在其中存储上下文,以便在生成进程时可以稍后继续。但是,我弹出的上下文似乎不正确。我怀疑这可能是由于我的全局当前上下文变量未正确分配?

         ucontext_t* currentContext;
         void system_init() {
           createQueue();
           isRunning = 0;
         }
    int uthread_create(void (* func)()) {
       ucontext_t *context;
       context = (ucontext_t*)malloc(sizeof(ucontext_t));
       getcontext(context);
       context->uc_stack.ss_sp = malloc(16384);
       context->uc_stack.ss_size = 16384;
       makecontext(context, func, 0);
       if(isRunning == 0) {
           isRunning = 1;
           currentContext = context;
           setcontext(context);
           return 0;
       }
       else {
           push(context);
           return 0;
       }
       return -1;
}

   int uthread_yield() {
        push(currentContext);
        currentContext = pop();
        setcontext(currentContext);
   }

以下是我的代码需要实现的方式:

int n threads=0;
int myid=0;
void do something()
{
     int id;
     id=myid;
     myid++;
     printf (”This is ult %dn”, id); //just for demo purpose
     if(n threads<5){
          uthread create(do something);
          n threads++;
          printf (”ult %d yields n”,id );
          uthread yield ();
          printf (”ult %d resumes n”,id);
          uthread create(do something);
          n threads++;
     }
     printf (”ult %d starts I/O n”,id);
     uthread startIO();
     sleep (2); //simulate some long−time I/O operation
     uthread endIO();
     printf (”ult %d returns from I/O n”,id);
     uthread exit ();
     }
main()
{
     int i ;
     system init ();
     uthread create(do something);
     uthread exit ();
}

它的预期输出为:

This is ult 0
ult 0 yields
This is ult 1
ult 1 yields
ult 0 resumes
ult 0 starts I/O
This is ult 2
ult 2 yields
ult 1 resumes
ult 1 starts I/O
This is ult 3
ult 3 starts I/O
This is ult 4
ult 4 starts I/O
ult 2 resumes
ult 2 starts I/O
This is ult 5
ult 5 starts I/O
ult 0 returns from I/O
ult 1 returns from I/O
ult 3 returns from I/O
ult 4 returns from I/O
ult 2 returns from I/O
ult 5 returns from I/O

但是我的输出只是:

This is ult 0
ult 0 yields
This is ult 1
ult 1 yields
This is ult 2
ult 2 yields
This is ult 3
ult 3 yields
This is ult 4
ult 4 yields
This is ult 5
ult 5 starts I/O
ult 5 returns from I/O

这表明我的线程没有恢复,而只是被跳过。

看起来您正在将数据类型ucontext_t推送到队列中。这将创建您放入队列的context的副本,这将导致问题,因为您将内存搁浅在堆中(更不用说放弃您创建的原始ucontext_t了)。

尝试使用队列存储类型为 ucontext_t * 而不是 ucontext_t 的指针。这样,您就不会占用内存,并且可以访问最初在从队列中弹出上下文时创建的进程。

最新更新