-2

有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("completed\n");
    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);
        }

一般来说,你需要制作一个Manager,其中会有一个队列,你需要找出哪个上下文处于活动状态并将其放在队列的末尾,并将控制权传递给另一个上下文

4

2 回答 2

0

是否可以通过队列对某人进行操作?也就是说,获取控件的上下文放在最后,然后将控件转移到另一个上下文,也就是在开头的上下文。

实际上,Manager不必是context,它可以是一个普通的函数。而且由于队列必须是全局的(以便main()可以将执行上下文排入队列),Manager不需要传递任何参数。因此管理器和执行功能可以如下所示:

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;并通过以下方式开始执行:

    q.push(&N1);
    q.push(&N2);
    swapcontext(&Main, q.front());  // switch to first context
于 2019-05-08T09:05:25.077 回答
0
  1. 我可以找出当前处于活动状态的上下文吗?

这对于 . 来说是微不足道的getcontext(),但您真正想知道的是在激活Manager之前哪个上下文处于活动状态。而且您不能这样做(除非旧上下文将信息存储在全局变量中)。

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

由于函数参数只能在函数入口时传递给Manager,并且Manager不会在其开始时重新输入,而是从 中返回swapcontext(),因此您不能这样做。

您可以通过管理器实现控制传递的方法是让它确定要激活哪个上下文,例如

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

通过使用数组 ofucontext_t代替 , N1,可以轻松地将其扩展到两个以上的上下文N2

于 2019-05-07T12:48:06.727 回答