我怎么知道哪种上下文处于活动状态



有2个问题。1.我可以找出当前活动的上下文吗?
2.我可以以某种方式传递一个ucontext,从一个函数到另一个函数作为参数。我想做这样的事情。:

    //Instead of this

      #include <pthread.h>
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ucontext.h>
    #include <queue>
    #define MEM 64000
    #define MEMS 16000
    #define MEL 32000
    using namespace std;
    ucontext_t N1,N2, Main;
    void fn1()
    {
    for(int i=0;i<=3;i++){
    cout<<i<<ndl;
    swapcontext(&N1,&N2);
    }
    }
    void fn2()
    { 
    for(int i=4;i<=7;i++){
    cout<<i<<endl;
    if(i==7)
    swapcontext(&N2,&Main);
    else
    swapcontext(&N2,&N1);
    }
    }
     int main(int argc, char *argv[])
    {
    getcontext(&Main);
    getcontext(&N1);
    getcontext(&N2);
    N1.uc_link=0;
    N1.uc_stack.ss_sp=malloc(MEM);
    N1.uc_stack.ss_size=MEM;
    N2.uc_link=0;
    N2.uc_stack.ss_sp=malloc(MEMS);
    N2.uc_stack.ss_size=MEMS;
    makecontext(&N1, fn1, 0);
    makecontext(&N2, fn2, 0);
    swapcontext(&Main,&N1);
    printf("completedn");
    exit(0);
    }
        //Do something like this
        void fn1()
        {
        for(int i=0;i<=3;i++){
        cout<<i<<endl;
        swapcontext(&N1,&Man);
        }
        }
        void fn2()
        { 
        for(int i=4;i<=7;i++){
        cout<<i<<endl;
        if(i==7)
        swapcontext(&N2,&Main);
        else
        swapcontext(&N2,&Man);
        }

       void Manager()// void Manager(ucontext_t u)??? and makecontext(&Man,(void(*)())Manager,1,...)
        {
        //which ucontext transferred control ?
         queue <ucontext> q;
        push.active_context;
        ...
        swapcontext(&Man,&another_context);
        }

通常,您需要制作一个将要有队列的经理,您需要找出哪个上下文活动并将其放在队列结束时,然后将控件传递到另一个上下文

  1. 我可以找出当前活动的上下文吗?

这对getcontext()来说是微不足道的,但是您实际上想发现的是,在激活 Manager 之前,哪些上下文已经处于活动状态。而且您无法做到这一点(除非旧上下文将信息存储在全局变量中(。

  1. 我可以以某种方式传递一个ucontext,从一个函数到另一个函数作为参数。

由于函数参数只能在函数输入到 manager 上传递,并且 manager 在开始时不会重新输入,而是从swapcontext()返回你不能那样做。

通过 Manager 实现控制传递的方法是让它确定要激活的上下文,e。g。

void Manager()
{
    ucontext_t *another_context = &N1;  // begin with N1
    for (;; another_context = another_context == &N1 ? &N2 : &N1)   // switch context
        swapcontext(&Man, another_context);
}

使用ucontext_t的数组而不是N1N2

有可能通过队列对某人做吗?也就是说,将获得控制的上下文放在末尾,然后将控件转移到另一个开始。

实际上, Manager 不必是上下文,它可以是一个简单的函数。而且,由于队列无论如何都必须是全局的(以便main()可以提出执行上下文(,因此 Manager 不需要任何传递的参数。因此, Manager 和执行功能看起来像e。g。:

queue <ucontext *> q;
void Manager()
{
    ucontext_t *active_context = q.front(); // active context is at queue front
    q.pop();                                // remove active context from front
    q.push(active_context);                 // insert active context at the end
    swapcontext(active_context, q.front()); // switch to the new active context
}
void fn1()
{
    for (int i=0; i<=3; i++)
    {
        cout<<i<<endl;
        Manager();
    }
}
void fn2()
{ 
    for (int i=4; i<=7; i++)
    {
        cout<<i<<endl;
        Manager();
    }
}

何时切换回到 main 上下文的决定将从函数中删除 - 相反,这是通过设置N1.uc_link = &Main;main()中完成的,并且执行的启动是:

    q.push(&N1);
    q.push(&N2);
    swapcontext(&Main, q.front());  // switch to first context

相关内容

  • 没有找到相关文章

最新更新